MD5加密
MD5加密属于hash算法,hash叫做散列信息摘要算法
特点:
1、不可逆:无法通过摘要信息还原出原始数据
2、算法有很多种,但是无论哪一种hash算法,最终产⽣的都是一个固定长度的字符串
3、对于任何类型长度的输入数据,都有着相同长度输出
4、对于相同输入和相同算法,产生的结果一定相同
(极小概率出现,不同输入 相同算法产生相同结果)
MD5解密
撞库
原理:提前把输入数据和输出结果做一个映射关系, 撞库时就是拿着结果(key)去查数据库 只要输入数据稍微复杂撞库就失败了
加盐
数据太简单 容易易被撞库 ,解决⽅方法就是加盐,即在原数据的基础上加上一些字符串,使数据不容易被撞库(在验证时也要加相同的字符串)
作用
1、加密 需要强调的是,加密的结果是无法反解的,存储的是密文, 查的时候 使用相同的算法加密,比较加密后的结果是否相同
2、数据校验 可以用来校验数据是否被篡改
MD5加密实现
MessageDigest
MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。信息摘要是安全的单向哈希函数,它接收任意大小的数据,输出固定长度的哈希值。
MessageDigest 对象开始被初始化。该对象通过使用 update 方法处理数据。任何时候都可以调用 reset 方法重置摘要。一旦所有需要更新的数据都已经被更新了,应该调用 digest 方法之一完成哈希计算。
对于给定数量的更新数据,digest 方法只能被调用一次。digest 被调用后,MessageDigest 对象被重新设置成其初始状态。
MD5实现
public class MD5Tool {
//加盐生成MD5,有定义算法
public static String getMD5(String text, String salt,String algorithm) {
try {
//创建一个算法对象,算法不为空则用参数算法,否则使用默认MD5算法加密
MessageDigest instance = MessageDigest.getInstance(algorithm!=null?algorithm:"MD5");
//以UTF-8字节的方式加入要进行加密的字符串
instance.update(text.getBytes("UTF-8"));
//如果salt不为空,则进行加盐
if (salt != null) {
instance.update(salt.getBytes("UTF-8"));
}
//digest方法进行哈希计算,并返回byte[]
byte[] digests = instance.digest();
//声明一个StringBuffer容器来储存十六进制的字符串
StringBuilder sb = new StringBuilder();
/*字节转16进制
对于字节是-128 - 127 如果小于0就加256(即digest & 0xFF)再转成十六进制
十六进制数为4个二进制位。一个字节为8个二进制位。因此,一个字节可表示为两个十六进制数字,
所以,如果hex.length()小于2要补0
*/
for (byte digest : digests) {
String hex = Integer.toHexString(digest & 0xFF);
if (hex.length() < 2) {
sb.append(0);
}
sb.append(hex);
}
//转字符串
return sb.toString();
} catch (Exception e) {//出现异常转为空
e.printStackTrace();
return null;
}
}
//不加盐生成MD5,没有定义算法
public static String getMD5(String text) {
return getMD5(text,null);
}
//加盐生成MD5,没有定义算法
public static String getMD5(String text,String salt) {
return getMD5(text,salt,null);
}
//测试
public static void main(String[] args) {
System.out.println(getMD5("abc"));
System.out.println(getMD5("abc","akjKJHKJAJKSHJKAHSJANJNJANS"));
System.out.println(getMD5("abc","akjKJHKJAJKSHJKAHSJANJNJANS","SHA-256"));
System.out.println(getMD5("abc",null,"SHA-512"));
}
}