什么是加盐算法
在面对这个网络世界的时候,密码安全总是各个公司和用户都非常关心的一个内容,毕竟现在大家不管是休闲娱乐还是学习购物都是通过网上的帐号来进行消费的,所以我们通常会给用户的密码进行加密。在加密的时候,经常会听到“加盐”这个词,这是什么意思呢?
我们通常会将用户的密码进行 Hash 加密,如果不加盐,即使是两层的 md5 都有可能通过彩虹表的方式进行破译。彩虹表就是在网上搜集的各种字符组合的 Hash 加密结果。而加盐,就是人为的通过一组随机字符与用户原密码的组合形成一个新的字符,从而增加破译的难度。就像做饭一样,加点盐味道会更好。
加盐算法的原理
加盐就是使用使用一个方法生成随机的字符串,这个生成的随机的字符串就是盐(salt)
//在这里使用的是SecureRandom ,也可以用Random
byte[] values = new byte[128];
SecureRandom random = new SecureRandom();
random.nextBytes(values);
生成的盐字符串会和我们的password字符串组合,进行加密,也就是为我们的原密码加盐。可以使用BASE64,RSA或者是PBK,MD5,我这里用BASE64举例
public String hashPassword(char[] passwordToHash, String salt) throws EA3PasswordHashException {
byte[] decodedSalt;
try {
decodedSalt = BASE64_DECODER.decodeBuffer(salt);
} catch (IOException var6) {
throw new EA3PasswordHashException(var6.getMessage());
}
PKCS5S2ParametersGenerator gen = new PKCS5S2ParametersGenerator(new SHA256Digest());
gen.init(PBEParametersGenerator.PKCS5PasswordToBytes(passwordToHash), decodedSalt, 100000);
byte[] secretKey = ((KeyParameter)gen.generateDerivedParameters(512)).getKey();
return BASE64_ENCODER.encode(secretKey);
}
这个密码相当于被加密了两次,更加的安全。
在注册的时候,我们直接对用户密码进行加密后入库。主要关注的地方是在登录时,我们先根据用户名查找出对应的用户信息。然后将用户登录提交上来的原文密码进行加密,与数据库中的原文密码进行对比验证,密码验证成功即可判断用户登录成功。
另外还需要注意的是,我们的盐字符串也是要存到数据库中的。毕竟在登录的时候我们还是需要将用户的原文密码与这个盐字符串进行组合加密之后才能进行密码的匹配。
作为程序员,我们应该始终都将用户的密码及重要信息进行加密处理,这是一种基本的职业规范。
借鉴了一下知乎大佬关于加盐的介绍https://zhuanlan.zhihu.com/p/144392745?utm_id=0,同时也有自己代码中例子,希望可以帮助到各位~
如有批评指正欢迎各位大佬评论喔!