一、加密种类的简单了解
常见加密算法分类
对称加密算法:DES、3DES、DESX、Blowfish、IDEA、RC4、RC5、RC6和AES
非对称加密算法:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)
Hash算法:MD2、MD4、MD5、HAVAL、SHA、SHA-1、HMAC、HMAC-MD5、HMAC-SHA1
简言之,非对称性加密就是不可逆
无法通过算法 根据加密密码反推出原密码
SHA256 加密:安全散列算法(Secure Hash Algorithm,缩写为SHA)
二、SHA256 加密
1.登录注册的密码加盐
// 盐值
String salt = null;
String password = user.getPassword();
//加密密码
String encryptPassword = null;
salt = SaltUtil.generateSalt();
encryPassword = PassWordUtil.encrypt(password,salt);
2.SaltUtil 类
public class SaltUtil {
/**
* 生成32位随机盐
*
* @return
*/
public static String generateSalt() {
return new SecureRandomNumberGenerator().nextBytes(16).toHex();
}
}
3.PassWordUtil 类
public class PasswordUtil {
/**
* 密码加盐,再加密
*
* @param pwd
* @param salt
* @return
*/
public static String encrypt(String pwd, String salt) {
if (StringUtils.isBlank(pwd)) {
throw new IllegalArgumentException("密码不能为空");
}
if (StringUtils.isBlank(salt)) {
throw new IllegalArgumentException("盐值不能为空");
}
return DigestUtils.sha256Hex(pwd + salt);
}
}
总结
salt:就是一串随机字符串,用于和用户密码拼接,再运行加密算法,得到不可重复的加密密码。
彩虹表是一个用于加密散列函数逆运算的预先计算好的表, 为破解密码的散列值(或称哈希值、微缩图、摘要、指纹、哈希密文)而准备。一般主流的彩虹表都在100G以上。 这样的表常常用于恢复由有限集字符组成的固定长度的纯文本密码。这是空间/时间替换的典型实践, 比每一次尝试都计算哈希的暴力破解处理时间少而储存空间多,但却比简单的对每条输入散列翻查表的破解方式储存空间少而处理时间多。使用加salt的KDF函数可以使这种攻击难以实现。彩虹表是马丁·赫尔曼早期提出的简单算法的应用。
如何防止彩虹表破解密码
答案:加盐