package com.tools.util;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; import javax.crypto.Cipher;
import javax.crypto.Mac;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder; /**
* ClassName:MD5Util <br/>
* Function: 使用jdk自带的MD5进行数据的加密与解密 <br/>
* Reason: 主要用来生成用户密码存入数据库中 <br/>
*
* @version 1.0
* @since JDK 1.7
* @see
*/
public class EncryptUtil {
private static final Log logger = LogFactory.getLog(EncryptUtil.class); private static final String SHA = "SHA";
private static final String SHA1 = "SHA1";
private static final String MD5 = "MD5";
private static final String HMAC_SHA1 = "HmacSHA1"; public static String Encrypt(String algorithm, String source) {
MessageDigest md5 = null;
try {
md5 = MessageDigest.getInstance(algorithm);
} catch (Exception e) {
logger.debug(e.getMessage());
return "";
}
char[] charArray = source.toCharArray();
byte[] byteArray = new byte[charArray.length]; for (int i = 0; i < charArray.length; i++)
byteArray[i] = (byte) charArray[i]; byte[] md5Bytes = md5.digest(byteArray); StringBuffer hexValue = new StringBuffer(); for (int i = 0; i < md5Bytes.length; i++) {
int val = ((int) md5Bytes[i]) & 0xff;
if (val < 16)
hexValue.append("0");
hexValue.append(Integer.toHexString(val));
} return hexValue.toString();
} /**
* SHA加密 并转换为16进制大写字符串
* @param source
* @return
*/
public static String encryptSHA(String source)
{
try {
MessageDigest sha = MessageDigest.getInstance(SHA);
sha.update(source.getBytes());
byte[] bytes = sha.digest(); StringBuilder stringBuilder = new StringBuilder("");
if (bytes == null || bytes.length <= 0) {
return null;
}
for (int i = 0; i < bytes.length; i++) {
int v = bytes[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv);
}
return stringBuilder.toString().toUpperCase(); } catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} return "";
} /**
* SHA加密 并转换为16进制大写字符串
* @param source
* @return
*/
public static String encryptSHA1(String source)
{
try {
MessageDigest sha = MessageDigest.getInstance(SHA1);
sha.update(source.getBytes());
byte[] bytes = sha.digest(); StringBuilder stringBuilder = new StringBuilder("");
if (bytes == null || bytes.length <= 0) {
return null;
}
for (int i = 0; i < bytes.length; i++) {
int v = bytes[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv);
}
return stringBuilder.toString().toUpperCase(); } catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} return "";
} /**
* BASE64加密
* @param key
* @return
* @throws Exception
*/
public static String encryptBASE64(byte[] key) {
return filter((new BASE64Encoder()).encodeBuffer(key));
} /**
* BASE64解密
* @param key
* @return
* @throws IOException
*/
public static byte[] decryptBASE64(String key) throws IOException {
return (new BASE64Decoder()).decodeBuffer(key);
} /**
* 删除BASE64加密时出现的换行符
* <功能详细描述>
* @param str
* @return
* @see [类、类#方法、类#成员]
*/
private static String filter(String str) {
String output = null;
StringBuffer sb = new StringBuffer();
for (int i = 0; i < str.length(); i++) {
int asc = str.charAt(i);
if (asc != 10 && asc != 13) {
sb.append(str.subSequence(i, i + 1));
}
}
output = new String(sb);
return output;
} /**
* MD5 加密
*/
public static String getMD5Str(String str) {
MessageDigest messageDigest = null; try {
messageDigest = MessageDigest.getInstance(MD5); messageDigest.reset(); messageDigest.update(str.getBytes("UTF-8")); } catch (NoSuchAlgorithmException e) {
System.out.println("NoSuchAlgorithmException caught!");
System.exit(-1);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} byte[] byteArray = messageDigest.digest(); StringBuffer md5StrBuff = new StringBuffer(); for (int i = 0; i < byteArray.length; i++) {
if (Integer.toHexString(0xFF & byteArray[i]).length() == 1)
md5StrBuff.append("0").append(
Integer.toHexString(0xFF & byteArray[i]));
else
md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));
} return md5StrBuff.toString();
} /**
* 加密
* @param encData 要加密的数据
* @param secretKey 密钥 ,16位的数字和字母
* @param vector 初始化向量,16位的数字和字母
* @return
* @throws Exception
*/
public static String Encrypt(String encData ,String secretKey,String vector) throws Exception { if(secretKey == null) {
return null;
}
if(secretKey.length() != 16) {
return null;
}
byte[] raw = secretKey.getBytes();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");// "算法/模式/补码方式"
IvParameterSpec iv = new IvParameterSpec(vector.getBytes());// 使用CBC模式,需要一个向量iv,可增加加密算法的强度
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = cipher.doFinal(encData.getBytes());
return ObjectSerializer.encodeBytes( encrypted );
} /**
* 生成签名数据
* @param data 待加密的数据
* @param key 加密使用的key
* @throws InvalidKeyException
* @throws NoSuchAlgorithmException
*/
public static byte[] getSignature(String data,String key) throws NoSuchAlgorithmException, InvalidKeyException {
byte[] keyBytes=key.getBytes();
SecretKeySpec signingKey = new SecretKeySpec(keyBytes, HMAC_SHA1);
Mac mac = Mac.getInstance(HMAC_SHA1);
mac.init(signingKey);
//byte[] rawHmac = mac.doFinal(("GET&"+data).getBytes());
byte[] rawHmac = mac.doFinal((data).getBytes());
/* StringBuilder sb=new StringBuilder();
for(byte b:rawHmac){
sb.append(byteToHexString(b));
} */
return rawHmac;
} private static String byteToHexString(byte ib){
char[] Digit={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
char[] ob=new char[2];
ob[0]=Digit[(ib>>>4)& 0X0f];
ob[1]=Digit[ib & 0X0F];
String s=new String(ob);
return s;
} /**
* 创富md5加密方法
*/
public static String encode(String encodestr)
{
try
{
char[] hexDigits = { '9', '0', '1', '4', 'g', '2', 'a', '5', 'p', '6', 'l', 'u', '7', '8', '3', 'e' };
byte[] strTemp = encodestr.getBytes();
MessageDigest mdTemp = MessageDigest.getInstance("MD5");
mdTemp.update(strTemp);
byte[] md = mdTemp.digest();
int j = md.length;
char[] str = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
str[(k++)] = hexDigits[(byte0 >>> 4 & 0xF)];
str[(k++)] = hexDigits[(byte0 & 0xF)];
}
return new String(str);
}
catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
} public static void main(String[] args) throws UnsupportedEncodingException
{
System.out.println(encode("yituke" + "abc"));
System.out.println(getMD5Str("yituke" + "abc")); }
}

  

jdk自带的MD5进行数据的加密与解密的更多相关文章

  1. PHP 使用 mcrypt 扩展中的 mcrypt_encrypt() 和 mcrypt_decrypt() 对数据进行加密和解密

    <?php /* 使用 mcrypt 扩展中的 mcrypt_encrypt() 和 mcrypt_decrypt() 对数据进行加密和解密 */ // 加密 $algorithm = MCRY ...

  2. Sql Server数据的加密与解密

    Sql Server数据的加密与解密 在sql server中,我们如何为数据进行加密与解密,避免使用者窃取机密数据? 对于一些敏感数据,如密码.卡号,一般不能使用正常数值来存储.否则会有安全隐患.以 ...

  3. AES对数据进行加密与解密

    AES对数据进行加密与解密随着对称密码的发展,DES数据加密标准算法由于密钥长度较小(56位),已经不适应当今分布式开放网络对数据加密安全性的要求,因此1997年NIST公开征集新的数据加密标准,即A ...

  4. C#:使用MD5对用户密码加密与解密

    C#中常涉及到对用户密码的加密于解密的算法,其中使用MD5加密是最常见的的实现方式.本文总结了通用的算法并结合了自己的一点小经验,分享给大家. 一.使用16位.32位.64位MD5方法对用户名加密 1 ...

  5. iOS开发之 AES+Base64数据混合加密与解密

    2016-04-08 09:03 编辑: liubinqww 分类:iOS开发 来源:liubinqww 投稿 4 889     "APP的数据安全已经牵动着我们开发者的心,简单的MD5/ ...

  6. 转 C#:使用MD5对用户密码加密与解密

    C#中常涉及到对用户密码的加密于解密的算法,其中使用MD5加密是最常见的的实现方式.本文总结了通用的算法并结合了自己的一点小经验,分享给大家. 一.使用16位.32位.64位MD5方法对用户名加密 1 ...

  7. MySQL 使用MD5对数据进行加密

    数据库MD5加密 -- ================ 测试 MD5 加密 ============== CREATE TABLE `testmd5`( id INT(11) NOT NULL AU ...

  8. Java使用基本JDK操作ZIP文件以及zip文件的加密、解密等功能

    Java使用基本JDK操作ZIP文件 http://blog.csdn.net/zhyh1986/article/details/7723649 Java解压和压缩带密码的zip文件 http://b ...

  9. 总结C语言在嵌入式开发中应用的知识点(文件数据的加密与解密)

    <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...

随机推荐

  1. PHP openssl函数库

    php openssl 函数库中.提供了大量的函数.但是我们一般用的最多的,就是 openssl_encrypt string openssl_encrypt ( string $data , str ...

  2. 五种基于RGB色彩空间统计的皮肤检测算法

    最近一直在研究多脸谱识别以及如何分辨多个皮肤区域是否是人脸的问题 网上找了很多资料,看了很多篇文章,将其中基于RGB色彩空间识别皮肤 的统计算法做了一下总结,统计识别方法主要是简单相比与很多其它基于 ...

  3. directX枚举系统设备类

    void CSysEnumDlg::DisplayFullCategorySet(void){    USES_CONVERSION;    HRESULT hr;    IEnumMoniker * ...

  4. FFMPEG:H264解码-SDL显示(RGB32、RGB24、YUV420P、YUV422)

    FFMpeg对视频文件进行解码的大致流程 1. 注册所有容器格式: av_register_all()2. 打开文件: av_open_input_file()3. 从文件中提取流信息: av_fin ...

  5. 资料--Linux开发

    <Linux/UNIX系统编程手册>凯利斯克 (Michael Kerrisk) <UNIX环境高级编程>(第2版),史蒂文斯著 <深入理解 Linux 内核>(第 ...

  6. winform自动更新程序实现

    一.问题背景 本地程序在实际项目使用过程中,因为可以操作电脑本地的一些信息,并且对于串口.OPC.并口等数据可以方便的进行收发,虽然现在软件行业看着动不动都是互联网啊啥的,大有Web服务就是高大上的感 ...

  7. PyTorch官方中文文档:PyTorch中文文档

    PyTorch中文文档 PyTorch是使用GPU和CPU优化的深度学习张量库. 说明 自动求导机制 CUDA语义 扩展PyTorch 多进程最佳实践 序列化语义 Package参考 torch to ...

  8. springboot入门的一点基础

    什么是SpringBoot java问世20年由于,发展到现在从技术角度来说已经很成熟,开发过程中我们总是在想如何去提高团队开发规范性.减少重复配置.避免低效开发.部署发布时流程的复杂度以及第三方技术 ...

  9. AndroidStudio 集成litepal 报错

    E/AndroidRuntime(24972): org.litepal.c.b: can not find a class named org.litepal.model.Table_Schema ...

  10. 空间主页播放任意FLV格式视频方法

      把文件上传到QQ网络硬盘 打开 硬盘 的 管理 选项 然后它会打开QQ邮箱的文件中转站 找到你要的视频文件 点击下载它 这里建议你使用搜狗浏览器打开网页 来到下载按钮点击下载,在弹出的对话框中选择 ...