java 散列算法,主要是通过MessageDigest 对象来实现,因此MD 和 SHA 系列可以共用一套代码
java 散列算法实现:依靠java 类库,(md5实现依据rfc1321 规范)
java 加密类库实现,一般是在security 包下,有两个security包
rt.jar 下的java/security
rt.jar 下的sun/security
1.首先是一个MessageDigest 信息摘要类,获得一个摘要对象,MessgaeDigest.getInstance("MD5");
//根据传入的 散列算法的名称获得一个digest实例,如:MD5,SHA-1,SHA-224等等... 要想知道具体支持哪些散列算法,可以去 rt.jar 下的sun/security/provider 包查看实体类支持
2.将要加密的字符串的字节数组传入digest对象,digest.update(byte b []) 方法
//java 注释:更新摘要信息,这里注意,将文本字符串转成字节数组的时候,编码是可选的,如:UTF-8,GBK,或是默认的ISO-8859-1
3.digest.digest()方法,实现最后的加密运算,返回加密后的字节数组
//digest.digest() 方法,抽象,最后,根据java 的继承extends 和实现体系,找到具体的provider 去实现信息摘要
4.最后算法输出长串字符,实际是将加密后的返回的摘要字节数组,逐个字节转成16进制,最后拼接成一个字符串;具体实现方法:Integer.toHexString(i);
package com.hash.sha;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* 散列算法
* sha-1 类似md5
* @author zcm
*
*/
//MAC算法主要集合了MD和SHA两大系列消息摘要算法。MD系列的算法有HmacMD2、HmacMD4、HmacMD5三种算法;
//SHA系列的算法有HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384.HmacSHA512五种算法。
public class TestSHA {
//SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512
public static final String enType_md2 = "MD2";
public static final String enType_md5 = "MD5";
public static final String enType_sha1 = "SHA-1";
public static final String enType_sha224 = "SHA-224";
public static final String enType_sha256 = "SHA-256";
public static final String enType_sha384 = "SHA-384";
public static final String enType_sha512 = "SHA-512";
public static void main(String[] args) throws UnsupportedEncodingException {
//System.out.println(sign("test","UTF-8",enType_md2));
System.out.println(sign("f","UTF-8",enType_sha1));
//098f6bcd4621d373cade4e832627b4f6
//098F6BCD4621D373CADE4E832627B4F6
}
/**
* 散列算法加密
*
* @param content 字符内容
* @param inputCharset 字符集
* @param enType 加密类型
* @return
*/
public static String sign(String content, String inputCharset,String enType) {
// 获取信息摘要 - 参数字典排序后字符串
try {
// 指定sha1算法
MessageDigest digest = MessageDigest.getInstance(enType);//sun.security.provider.SHA@74c6fd6e //sun.security.provider.MD2@4e2c390c
digest.update(content.getBytes(inputCharset));
// 获取字节数组
byte messageDigest[] = digest.digest();
// Create Hex String
StringBuffer hexString = new StringBuffer();
// 字节数组转换为 十六进制 数
for (int i = 0; i < messageDigest.length; i++) {
String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
if (shaHex.length() < 2) {
hexString.append(0);
}
hexString.append(shaHex);
}
return hexString.toString().toUpperCase();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
}