今天因为业务需要,所以就去简单了解了一下java中MD5以及SHA加密算法的一些用法知识,特此整理,方便以后查看。
一.MD5简介
MD5(英文全称是Message Digest Algorithm,中文名为消息摘要第5版),是计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。它由MD2、MD3、MD4发展而来的一种单向函数算法(也就是HASH算法),也就是说我们不能通过一段字符反向逆推出原来的明文。MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。除了MD5以外,其中比较有名的还有sha-1、RIPEMD以及Haval等。
二.SHA简介
三.MD5余SHA之间的区别和联系
因为二者均由MD4导出,SHA-1和MD5彼此很相似。相应的,他们的强度和其他特性也是相似,但还有以下几点不同:
1)对强行攻击的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2^128数量级的操作,而对SHA-1则是2^160数量级的操作。这样,SHA-1对强行攻击有更大的强度。
2)对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。
3)速度:在相同的硬件上,SHA-1的运行速度比MD5慢
四.java中MD5和SHA算法的代码实现(主要是一个工具类)
import java.security.MessageDigest;
/**
* 签名加密工具
*
*/
public class SignUtil {
private static final String TOKEN = "supperapp"; // 加密token
/***
* MD5加密 生成32位md5码 速度比较快 性能高 安全强度比sha1要低
*
* @param 待加密字符串
* @return 返回32位md5码
*/
public static String md5EncodeSignature(String inStr) throws Exception {
MessageDigest md5 = null;
try {
md5 = MessageDigest.getInstance("MD5");
} catch (Exception e) {
e.printStackTrace();
return "";
}
byte[] byteArray = inStr.getBytes("UTF-8");
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加密 生成40位SHA码 加密速度比md5慢 性能比md5低 安全强度比md5高
*
* @param 待加密字符串
* @return 返回40位SHA码
*/
public static String shaEncodeSignature(String inStr) throws Exception {
MessageDigest sha = null;
try {
sha = MessageDigest.getInstance("SHA");
} catch (Exception e) {
e.printStackTrace();
return "";
}
byte[] byteArray = inStr.getBytes("UTF-8");
byte[] md5Bytes = sha.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();
}
/**
* 签名加密
*
* @param inStr
* @param type
* 加密方式 1,MD5 2,SHA
* @return
*/
public static String signature(String inStr, int type) {
String encodeStr = "";
int sel = type;
if (sel == 0) {
try {
encodeStr = md5EncodeSignature(TOKEN+":"+ inStr);
} catch (Exception e) {
e.printStackTrace();
}
} else {
try {
encodeStr = shaEncodeSignature(TOKEN+":" + inStr);
} catch (Exception e) {
e.printStackTrace();
}
}
return encodeStr;
}
}
MD5_百度百科:http://baike.baidu.com/view/7636.htm?fr=aladdin
SHA_百度百科:http://baike.baidu.com/link?url=FmqSdqu1CxQXDnQPxCD3hTdepu0RWV6N5dec5ZNWSC_U4WWle4a1h0E6744FnCRI