后端通常会对用户注册的密码进行加密处理,大多采用MD5+salt+散列。盐是一定长度的随机乱码,每次都是随机生成的(但我写的这个是自定义的,因为规模很小,拿来练手的)
1. MD5
MD5(Message-Digest Algorithm 5)是一种广泛使用的密码散列函数,它可以接受任意长度的数据作为输入,并产生一个128位(16字节)的散列值(hash value),通常表示为一个32位的十六进制数。MD5的主要特点是不可逆性,即无法从散列值恢复原始数据。然而,需要注意的是,MD5算法因其容易受到碰撞攻击(即存在不同的输入产生相同输出的情况)和彩虹表攻击(利用预先计算好的哈希值来破解密码),现已不再被认为是安全的加密算法,尤其是在密码存储等安全要求较高的场合。
2. 散列(Hashing)
散列是一种将任意长度的输入数据(消息)通过某种算法转换为固定长度输出(散列值)的过程。散列算法通常具有单向性、定长输出和敏感性等特点。在密码学和数据安全领域,散列算法被广泛应用于数据完整性验证、密码存储等领域。通过散列算法,可以确保数据的完整性和一致性,同时保护数据的隐私性。
3. Salt(盐)
在密码学中,Salt(盐)是一个随机生成的字符串,用于与密码一起进行散列处理。加盐的目的是增加密码的复杂性和独特性,从而提高密码存储的安全性。通过为每个密码生成一个唯一的盐值,并将其与密码一起存储在数据库中,即使两个用户使用了相同的密码,由于盐值的不同,它们的散列值也会不同。这样,攻击者就无法使用彩虹表等预计算哈希值的方法来破解密码。
MD5+散列+salt的组合应用
在密码存储等场合,MD5+散列+salt的组合应用可以提高密码的安全性。具体来说,当用户设置密码时,系统会生成一个随机的盐值,并将其与密码一起进行MD5散列处理。然后,将得到的散列值和盐值一起存储在数据库中。当用户登录时,系统会取出存储的盐值,将其与用户输入的密码结合,再次进行MD5散列处理,并将结果与数据库中存储的散列值进行比较以验证密码的正确性。由于盐值的存在,即使两个用户使用了相同的密码,它们的散列值也会不同,从而有效地防止了彩虹表攻击等密码破解方法。
然而,需要注意的是,尽管加盐可以提高密码存储的安全性,但MD5本身因其存在的碰撞问题和彩虹表攻击等安全性问题,已不再是密码存储等安全要求较高的场合的首选算法。在需要高安全性的场合,建议使用更安全的散列算法,如SHA-256或SHA-3等。
public class SaltUtils {
public static String SALT = "gsj&lqr@#1)23456";
public static String MD5WithSalt(String hashResult) {
char[] cs = new char[48];
// 输出带盐,存储盐到hash值中; 每两个hash字符中间插入一个盐字符
for (int i = 0; i < 48; i += 3) {
cs[i] = hashResult.charAt(i / 3 * 2);
cs[i + 1] = SALT.charAt(i / 3);
cs[i + 2] = hashResult.charAt(i / 3 * 2 + 1);
}
return new String(cs);
}
}
这个是在密码之间加盐,其实也可以用append函数在密码的末尾加盐。(注意字符串的改变应使用StringBuilder,最后在改成String格式用来返回)