密码学中的Salt
盐值
盐值(Salt) 是一种加密技术中常用的随机数据,主要用于增强密码存储的安全性 。
背景
当数据库的信息泄露后,我们就可以轻松获取到密码、身份证号、手机号等敏感信息,虽然这些信息在数据库中是以密文的形式存在,但由于相同数据经过相同加密算法后得到的密文一般是一致的。这就使得攻击者极大程度降低了破解密码的难度,因此我们需要对用户输入的敏感信息进行包装(加盐),来增加密码被破解的难度,从而保护用户信息。
摘要算法
摘要算法(又称哈希函数)是一种单向加密函数,用于将任意长度的输入数据(如消息或文件)转换为固定长度的输出值(称为摘要或哈希值)。 摘要算法时不可逆的(无法解密),通常用来检验数据的完整性。
基于上述,我们可以利用MD5来实现对(32位盐值+明文)的加密形成32位密文,这里我们规定存储在数据库中的数据是(32位盐值+32位密文)即盐值+MD5(盐值+明文)
,从而便于我们实现数据的验证。
import org.springframework.util.DigestUtils;import java.util.UUID;public class SecurityUtils {private static final int LENGTH = 32;/*** encrypt* 对密码加密* @param password* @return salt + md5(salt + 明文)*/public static String encrypt(String password) {//随机生成32位盐值String salt = UUID.randomUUID().toString().replace("-","");//md5(salt + password)String encryptedPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());return salt + encryptedPassword;}/*** verify* 校验密码* @param password , encryptedPassword* @return true/false*/public static Boolean verify(String password,String encryptedPassword) {//校验密码长度是否合法if(password == null || encryptedPassword == null || encryptedPassword.length() != LENGTH * 2 ) {return false;}//获取盐值String salt = encryptedPassword.substring(0,LENGTH);//md5(salt + 待确认密码) -> finalPasswordString finalPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());return encryptedPassword.equals(salt + finalPassword);}}