对此流程有何评论/改进?
用户表:
id,用户名,密码,盐
存储新用户
- 从$ _POST
接收用户名(纯文本)
- 从$ _POST
接收密码(使用javascript sha512'd)http://pajhome.org.uk/crypt/md5/sha512.html
- 在服务器上生成128个字符的盐(带符号的字母数字)并将其存储在盐柱中
- 使用salt预先设置密码哈希并将其保存在密码列
中
醇>
1 个答案:
答案 0 :(得分:2)
是。一些事情:
- 使用Javascript对数据客户端进行散列是没有意义的。使用https来传输数据。
- 盐点是为了阻止彩虹表攻击,攻击者已经预先计算了大量字符串的哈希值,以便找到从哈希到原始字符串的反向对应关系。将盐添加到哈希密码是没有意义的,因为攻击者可以简单地剥离盐。
正确的方法是:
- 仅通过https(无Javascript)
将密码发送到服务器
- 生成一个长的随机盐 - 使用一个好的随机生成器(不是PHP的
rand
...)
- 将密码附加到salt
- 存储salt +密码的哈希值以及盐。
醇>
然后,进行身份验证:
- 仅通过https
将密码发送到服务器
- 从数据库中获取盐
- 将密码附加到salt
- 计算salt +密码的哈希值,并与数据库中的内容进行比较
醇>