1. 在 Web 应用程序中,始终在服务器上进行散列
密码应该在前端中用JavaScript散列,还是应该将明文密码发送到服务器再进行散列呢?
即使前端使用JavaScript散列用户密码,也必须在服务器上散列。否则客户端的哈希值逻辑上变成了用户的密码。用户需要做的只是告诉服务器他们密码的散列。如果一个坏人得到了一个用户的散列,他们可以用它来验证服务器,而不需要知道用户的密码!因此,如果坏人不知何故从这个假想的网站窃取了哈希数据库,他们就可以立即访问每个人的帐户,而不必猜测任何密码。
2. 用盐做散列
每个用户每个密码的salt必须是唯一的。每次用户创建帐户或更改密码时,都应该使用新的随机salt对密码进行哈希运算。不要重复使用盐。盐也应该足够长, 以保证有足够多的盐用于哈希加密。根据经验,使salt至少与哈希函数的输出一样长。salt应该与hash一起存储在用户账户表中
3. 保存密码
- 将salt预先混入密码中(通常把盐放在密码之前),并使用标准密码哈希函数(如Argon2、bcrypt、scrypt或PBKDF2)对其进行哈希运算。
- 在用户的数据库记录中保存salt和hash。
4. 校验密码
- 从数据库中检索用户的salt和hash。
- 将salt混入用户提交的密码,并使用相同的哈希函数对其进行哈希运算。
- 将给定密码的哈希值与数据库中的哈希值进行比较。如果匹配,则密码正确。否则,密码不正确。
5. 要保证对比密码的操作时间相同
我不知道你的密码, 但是密码的每一位肯定是在256个字符串中间的某一个, 假如代码不遵循 ‘操作时间相同’ 原则, 那我试这256次, 耗时最长的那一个肯定是第一位是对的, 然后我试第二个字符, 一直到我试出来密码或者我根据试出来的猜测出密码
参考:https://www.cnblogs.com/chnmig/p/14475648.html