MD5加密介绍
Message Digest Algorithm MD5(消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。
应用场景
在企业中,登录账户表,里面的密码是加密的,为了防止数据管理员或IT部内部人员数据泄密。注册用户的时候,添加用户,将用户数据新增到数据库里面的时候就将用户的密码加密存储。加密算法有很多种,有一种不可逆的加密算法MD5。
特点:
压缩性:任意长度字符串根据散列哈希算法得到一个
16
进制
32
个字符长度的字符串
容易计算:从原数据计算出
MD5
值很容易。
抗修改性:对原数据进行任何改动,哪怕只修改
1
个字节,所得到的
MD5
值都有很大区别。
强抗碰撞:已知原数据和其
MD5
值,想找到一个具有相同
MD5
值的数据(即伪造数据)是非常困难的。
不可逆的算法:由
A
字符串加密成
B
字符串,
B
是永远无法反推出
A
的。
缺点:相同的明文,加密出来的结果是一样的
密码加盐
只对密码进行
md5
加密是肯定不够的。
解决方法:即使用户的密码很短,只要我在他的短密码后面加上一段很长的字符,再计算
md5
,那反推出原始密码就变得非常困难了。加上的这段长字符,我们称为盐(
Salt
),通过这种方式加密的结果,我们称为 加盐。
密码字段 = md5(用户名+密码+Salt)
固定md5工具类 --Md5Utils
/**
* 对给定的字符使用md5进行加密,返回加密以后的字符串
*
* @param origin 要加密的字符串
* @return 加密以后的
*/
public static String getMd5(String origin) {
// 1) 使用静态方法,创建MessageDigest对象
try {
MessageDigest md = MessageDigest.getInstance("MD5");
// 2) 将字符串使用utf-8进行编码,得到字节数组
byte[] input = origin.getBytes("utf-8");
// 3) 使用digest(input)对字节数组进行md5的哈希计算,得到加密以后的字节数组,长度是16个字节。
byte[] num = md.digest(input);
// 4) 使用类BigInteger(1, 加密后的字节数组),将这个二进制数组转成无符号的大整数
// 1 正数, -1表示负数
BigInteger big = new BigInteger(1, num);
// 5) 将这个大整数转成16进制字符串,参数为多少进制
return big.toString(16);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}