转载:http://www.weixuehao.com/archives/474
MD5介绍
MD5 即 message-digest algorithm 5(信息-摘要算法)。
MD5是一种算法。可以将一个字符串,或文件,或压缩包,执行md5后,能够生成一个固定长度为128bit的串。这个串,基本上是唯一的。
所以,如果有人修改过源文件,就会生成新的md5串。
MD5只是一个摘要算法,并不是加密算法
(1)加密后的消息是完整的。具有解密算法,能够得到原始数据。
(2)摘要得到的消息是不完整的。通过摘要的结果,不能得到原始数据。
MD5长度问题
有人说md5,128位,32位,16位,到底md5多长?
md5的长度,默认为128bit,也就是128个0和1的二进制串。这样表达是很不友好的。
所以将二进制转成了16进制,每4个bit表示一个16进制,所以128/4 = 32 换成16进制表示后,为32位了。
而16位的md5,是从32位md5值来的。16位的md5是将32位md5去掉前八位,去掉后八位得到的。
MD5的作用
①一致性检验,比如很多网站提供下载文件的md5值。
②数字签名,还是检验问题。只是把md5看成一个指纹,作为独一无二的标识。
③安全访问认证,这个就是平时系统设计的问题了。
在用户注册时,会将密码进行md5加密,存到数据库中。这样可以防止那些可以看到数据库数据的人,恶意操作了。
md5不能破解吗?
md5是不可逆的,也就是没有对应的算法,从生产的md5值逆向得到原始数据。
但是如果使用暴力破解,那就另说了。
md5是唯一的吗?
md5作为数据库中的主键可行吗?这就涉及到一个问题,md5值是唯一的吗?答案是,不唯一。
一个原始数据,只对应一个md5值;
但是一个md5值,可能对应多个原始数据。
java中生成MD5的值
public class MD5Test {
//main测试类
public static void main(String[] args) {
String result = getMD5("aaa");
System.err.println(result);
}
/**
* 生成md5
* @param message
* @return
*/
public static String getMD5(String message) {
String md5str = "";
try {
//1 创建一个提供信息摘要算法的对象,初始化为md5算法对象
MessageDigest md = MessageDigest.getInstance("MD5");
//2 将消息变成byte数组
byte[] input = message.getBytes();
//3 计算后获得字节数组,这就是那128位了
byte[] buff = md.digest(input);
//4 把数组每一字节(一个字节占八位)换成16进制连成md5字符串
md5str = bytesToHex(buff);
} catch (Exception e) {
e.printStackTrace();
}
return md5str;
}
/**
* 二进制转十六进制
* @param bytes
* @return
*/
public static String bytesToHex(byte[] bytes) {
StringBuffer md5str = new StringBuffer();
//把数组每一字节换成16进制连成md5字符串
int digital;
for (int i = 0; i < bytes.length; i++) {
digital = bytes[i];
if(digital < 0) {
digital += 256;
}
if(digital < 16){
md5str.append("0");
}
md5str.append(Integer.toHexString(digital));
}
return md5str.toString().toUpperCase();
}
}
Spring框架中DigestUtils工具生成md5
引入:
import org.springframework.util.DigestUtils;
方法:
//md5盐值字符串,用于混淆MD5
private final String slat = "wfwerjsa%#%dsfdf&*^sdfds4329rugr8fh&*ᑶ$##$";
//生成MD5的方法
private String getMD5(long password) {
String base = password + "/" + slat;
String md5 = DigestUtils.md5DigestAsHex(base.getBytes());
return md5;
}