Java 常用加密算法(一)---单向加密算法(MD5/SHA)
- MD5加密
MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
在MD5算法中,首先需要对信息进行填充,使其位长对512求余的结果等于448。因此,信息的位长(Bits Length)将被扩展至N512+448,N为一个非负整数,N可以是零。填充的方法如下,在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。然后,在这个结果后面附加一个以64位二进制表示的填充前信息长度。经过这两步的处理,信息的位长=N512+448+64=(N+1)*512,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。
/**
* MD5 加密工具类
* @author mazaiting
*/
public class Md5Util {
/**
* MD5 加密 生成32位MD5码
* @param source 需要加密的字符串
* @return 32位MD5码
*/
public static String encode(String source) {
try {
// 获得MD5 消息摘要
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
// 获得指定编码的字节数据
byte[] sourceBytes = source.getBytes("UTF-8");
// 指定的字节数组对摘要执行最终更新
byte[] digestBytes = messageDigest.digest(sourceBytes);
StringBuffer hexValue = new StringBuffer();
for (int i = 0; i < digestBytes.length; i++) {
int val = (digestBytes[i] & 0xff);
if (val < 16){
hexValue.append("0");
}
hexValue.append(Integer.toHexString(val));
}
return hexValue.toString();
} catch (NoSuchAlgorithmException e) {
return null;// 获得MD5 消息摘要异常
} catch (UnsupportedEncodingException e) {
return null;// 获得指定编码的字节数据异常
}
}
}
- SHA
SHA是一种数据加密算法,该算法经过加密专家多年来的发展和改进已日益完善,现在已成为公认的最安全的散列算法之一,并被广泛使用。该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。散列函数值可以说是对明文的一种“指纹”或是“摘要”所以对散列值的数字签名就可以视为对此明文的数字签名。
安全散列算法SHA(Secure Hash Algorithm,SHA)是美国国家标准技术研究所发布的国家标准FIPS PUB 180,最新的标准已经于2008年更新到FIPS PUB 180-3。其中规定了SHA-1,SHA-224,SHA-256,SHA-384,和SHA-512这几种单向散列算法。SHA-1,SHA-224和SHA-256适用于长度不超过264二进制位的消息。SHA-384和SHA-512适用于长度不超过2128二进制位的消息。
/**
* 采用SHA 加密
* @author mazaiting
*/
public class SHAUtil {
/**
* SHA 加密 生成40位SHA码
* @param source 待加密字符串
* @return 返回40位SHA码
*/
public static String encode(String source) {
try {
// 获取SHA的消息摘要
MessageDigest messageDigest = MessageDigest.getInstance("SHA");
// 获取指定编码的字符串字节数组
byte[] sourceBytes = source.getBytes("UTF-8");
// 对指定字节数据进行更新
byte[] digestBytes = messageDigest.digest(sourceBytes);
StringBuffer hexValue = new StringBuffer();
for (int i = 0; i < digestBytes.length; i++) {
int val = (digestBytes[i] & 0xff);
if (val < 16) {
hexValue.append("0");
}
hexValue.append(Integer.toHexString(val));
}
return hexValue.toString();
} catch (NoSuchAlgorithmException e) {
return null;// 获取SHA的消息摘要异常
} catch (UnsupportedEncodingException e) {
return null;// 获取指定编码的字符串字节数组失败
}
}
}
代码下载