MD5:
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* 数字摘要 可比 指纹
* MD5 16byte
* SHA 20byte
* 有以上两种算法
* @author ETHAN
*
*/
public class MD5Test {
/**
* @param args
* @throws NoSuchAlgorithmException
*/
public static void main(String[] args) throws NoSuchAlgorithmException {
// TODO Auto-generated method stub
String result = toHex(md5("ethan"));
System.out.println(result);
}
//通常是把 二进制数据转化为 十六进制,便于查看
//128 bit
private static byte[] md5(String src) throws NoSuchAlgorithmException {
MessageDigest digest = MessageDigest.getInstance("MD5");
digest.update(src.getBytes());
//返回16bytes字节数组 都是1 0 二进制数据
byte[] results = digest.digest();
//digest.digest("ethan".getBytes());
System.out.println(results.length);
return results;
}
private static String toHex(byte[] buffer) {
//线程安全的
StringBuilder sb = new StringBuilder();
for(int i=0;i<buffer.length;i++) {
//一个字节 8 bit 向右移4位,取得高四位,根据高位补位,是1就全补1
int hi = ((buffer[i]>>4)&0x0f);
int lo = buffer[i] & 0x0f;
//字符串 和 数字相加 会自动转换为数字
//10-10+a = a
sb.append(hi>9?(char)((hi-10)+'a'):(char)(hi+'0'));
//低四位
sb.append(lo>9?(char)((lo-10)+'a'):(char)(lo+'0'));
}
return sb.toString();
}
}
MAC:
import java.security.NoSuchAlgorithmException;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
/**
* 基于MAC(消息验证码)的数字摘要
* message authentication code,密钥被用作生成消息摘要的一部分
* 防止内容和摘要同时被篡改,在一定程度上起到了验证发送者身份
* @author ETHAN
*
*/
public class MACTest {
/**
* @param args
* @throws NoSuchAlgorithmException
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
//密码
PBEKeySpec keySpec = new PBEKeySpec("ethan".toCharArray());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
SecretKey key = keyFactory.generateSecret(keySpec);
Mac mac = Mac.getInstance("HmacMD5");//算法
//验证者需要同样的密钥密码"ethan".toCharArray()
mac.init(key);
//内容
byte[] src= new byte[] {1,2,3,5};
//产生的摘要
byte[] dest = mac.doFinal(src);
System.out.println(dest.length);
for(int i=0;i<dest.length;i++) {
System.out.println(dest[i]+".");
}
}
}