概要
本篇内容简要介绍BASE64、MD5、SHA、HMAC几种加密算法.BASE64编码算法不算是真正的加密算法。MD5、SHA、HMAC这三种消息摘要算法,可谓是非可逆加密,就是不可解密的加密方法(单向)。
- BASE64 严格地说,属于编码格式,而非加密算法
- MD5(Message Digest algorithm 5,信息摘要算法)
- SHA(Secure Hash Algorithm,安全散列算法)
- HMAC(Hash Message Authentication Code,散列消息鉴别码)
消息摘要算法用于数据校验、对称加密算法用于数据加密、非对称加密算法用于密钥交换、数字签名算法用于身份验证等等。
BASE64
/**
* @Title: encryptBASE64
* @Description: Base64加密 用Commons Codec实现
* @param key
* @return String
*/
public static String encryptBASE64(byte[] key) {
byte[] data = Base64.encodeBase64(key);
return new String(data);
}
/**
* @Title: decryptBASE64
* @Description: Base64解密 用Commons Codec实现
* @param key
* @return byte[]
*/
public static byte[] decryptBASE64(String key) {
return Base64.decodeBase64(key);
}
MD5
/**
* @Title: encryptMD5
* @Description: MD5加密 JDK实现
* @param data
* @return String
* @throws Exception
*/
public static String encryptMD5(byte[] data) throws Exception {
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] value = md5.digest(data);
return Hex.encodeHexString(value);
}
/**
* @Title: encryptMD5Hex
* @Description: MD5加密 用Commons Codec实现
* @param data
* @return String
* @throws Exception
*/
public static String encryptMD5Hex(byte[] data) throws Exception {
return DigestUtils.md5Hex(data);
}
SHA
/**
* @Title: encodeSHA
* @Description: SHA加密 JDK实现
* @param data
* @return String
* @throws Exception
*/
public static String encryptSHA(byte[] data) throws Exception {
MessageDigest md5 = MessageDigest.getInstance("SHA");
byte[] value = md5.digest(data);
return Hex.encodeHexString(value);
}
/**
* @Title: encodeSHAHex
* @Description: SHA加密 用Commons Codec实现
* @param data
* @return String
* @throws Exception
*/
public static String encryptSHAHex(byte[] data) throws Exception {
return DigestUtils.sha1Hex(data);
}
HMAC
/**
* @Title: initHMacMD5Key
* @Description: 初始化HMacMD5密钥
* @return byte[]
* @throws Exception
*/
public static byte[] initHMacMD5Key() throws Exception {
// 初始化KeyGenerator
KeyGenerator keyGenerator = KeyGenerator.getInstance("HMacMD5");
// 产生密钥
SecretKey secretKey = keyGenerator.generateKey();
// 获取密钥
return secretKey.getEncoded();
}
/**
* @Title: encryptHMacMD5
* @Description: HMacMD5消息摘要 JDK实现
* @param data 待做摘要处理的数据
* @param key 密钥
* @return String
* @throws Exception
*/
public String encryptHMacMD5(byte[] data, byte[] key) throws Exception {
// 还原密钥
SecretKey secretKey = new SecretKeySpec(key, "HMacMD5");
// 实例化Mac
Mac mac = Mac.getInstance(secretKey.getAlgorithm());
// 初始化Mac
mac.init(secretKey);
// 执行消息摘要
return Hex.encodeHexString(mac.doFinal(data));
}
为了弥补Java在加密解密算法API的不足,例如第三方开源组件Bouncy Castle和Apache Commons Codec是个不错的选择