数据加盐/加密
1.加密算法分类:
1. 对称密码算法 是指加密秘钥和解密秘钥相同的密码算法. 常⻅的对称密码算法有: AES, DES, 3DES,RC4, RC5, RC6 等。
2. ⾮对称密码算法 是指加密秘钥和解密秘钥不同的密码算法. 该算法使⽤⼀个秘钥进⾏加密, ⽤另外⼀个秘钥进⾏解密。
◦ 加密秘钥可以公开,⼜称为 公钥
◦ 解密秘钥必须保密,⼜称为 私钥
常⻅的⾮对称密码算法有: RSA, DSA, ECDSA, ECC 等。
3. 摘要算法 是指把任意⻓度的输⼊消息数据转化为固定⻓度的输出数据的⼀种密码算法. 摘要算法是不可逆的, 也就是⽆法解密. 通常⽤来检验数据的完整性的重要技术, 即对数据进⾏哈希计算然后⽐较摘要值, 判断是否⼀致. 常⻅的摘要算法有: MD5, SHA系列(SHA1, SHA2等), CRC(CRC8, CRC16,CRC32)
2.实现基础加密
问题:
虽然经过MD5加密后的密⽂⽆法解密,但由于相同的密码经过MD5哈希之后的密⽂是相同的,当存储⽤⼾密码的数据库泄露后,攻击者会很容易便能找到相同密码的⽤⼾,从⽽降低了破解密码的难度。因此,在对⽤⼾密码进⾏加密时,需要考虑对密码进⾏包装,即使是相同的密码,也保存为不同的密⽂。即使⽤⼾输⼊的是弱密码,也考虑进⾏增强,从⽽增加密码被攻破的难度。
解决方案:
采⽤为⼀个密码拼接⼀个随机字符来进⾏加密,这个随机字符我们称之为"盐"。假如有⼀个加盐后的加密串,⿊客通过⼀定⼿段这个加密串,他拿到的明⽂并不是我们加密前的字符串,⽽是加密前的字符串和盐组合的字符串,这样相对来说⼜增加了字符串的安全性。.
解密流程:
通过盐值和明文生成的密文,然后把密文和盐值组合,储存在数据库,然后解密的时候先判断出盐值然后在和明文密码使用算法加密,在判断这个加密的字符串和原始数据库中加密的字符串是否一致。
3.简易的代码实现
public class SecurityUtil {/*** 加密* md5(salt+明文)* @return 盐值 + md5(盐值+明文)*/public static String encrypt(String password){String salt = UUID.randomUUID().toString().replace("-","");String securityPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes(StandardCharsets.UTF_8));return salt+securityPassword;}/*** 验证* 数据库存储的是 盐值 + md5(盐值+明文)* @return*/public static boolean verify(String inputPassword, String sqlPassword){if (!StringUtils.hasLength(inputPassword)){return false;}if (sqlPassword==null || sqlPassword.length()!=64){return false;}String salt= sqlPassword.substring(0,32); //取出盐值String securityPassword = DigestUtils.md5DigestAsHex((salt + inputPassword).getBytes(StandardCharsets.UTF_8));boolean T = sqlPassword.equals(salt+securityPassword);return T;}
}