通过HTTP将用户凭证保存到数据库的算法

时间:2010-08-18 00:54:04

标签: php authentication

对此流程有何评论/改进?

用户表: id,用户名,密码,盐

存储新用户

  1. 从$ _POST
  2. 接收用户名(纯文本)
  3. 从$ _POST
  4. 接收密码(使用javascript sha512'd)http://pajhome.org.uk/crypt/md5/sha512.html
  5. 在服务器上生成128个字符的盐(带符号的字母数字)并将其存储在盐柱中
  6. 使用salt预先设置密码哈希并将其保存在密码列

1 个答案:

答案 0 :(得分:2)

是。一些事情:

  • 使用Javascript对数据客户端进行散列是没有意义的。使用https来传输数据。
  • 盐点是为了阻止彩虹表攻击,攻击者已经预先计算了大量字符串的哈希值,以便找到从哈希到原始字符串的反向对应关系。将盐添加到哈希密码是没有意义的,因为攻击者可以简单地剥离盐。

正确的方法是:

  1. 仅通过https(无Javascript)
  2. 将密码发送到服务器
  3. 生成一个长的随机盐 - 使用一个好的随机生成器(不是PHP的rand ...)
  4. 将密码附加到salt
  5. 存储salt +密码的哈希值以及盐。
  6. 然后,进行身份验证:

    1. 仅通过https
    2. 将密码发送到服务器
    3. 从数据库中获取盐
    4. 将密码附加到salt
    5. 计算salt +密码的哈希值,并与数据库中的内容进行比较