【问题标题】:Xcode salting and hashing a passwordXcode 加盐和散列密码
【发布时间】:2015-08-20 08:36:29
【问题描述】:

我有一个 iPhone 应用程序需要用户注册才能使用它。我获取包括密码在内的常用信息。 我正在将用户注册详细信息保存到我的服务器,并通过在密码前添加盐字符串然后对结果进行散列来进行加密。

#define一个盐字符串,用于添加到我所有的密码,但我读到盐应该是每个新密码的随机生成的字符串。

这一切都很好,我设法为每个密码生成一个唯一的字符串。

当我在注册时保存密码时,加盐/散列值被发送到我在服务器上的数据库并保存在“密码”列中。

现在假设用户退出,然后尝试使用他们保存的密码重新登录。 他们输入他们的密码,然后我对密码进行加盐和散列以进行发送,它进入数据库检查并且它与任何密码都不匹配,因为登录密码使用新的随机盐字符串加盐/散列。

我该如何处理,或者我的流程是否混乱?

我应该为每个新密码生成一个新的随机盐字符串,还是只为所有密码使用 1 个盐字符串?

【问题讨论】:

    标签: hash passwords salt


    【解决方案1】:

    如今的 password_hash() 函数通常在生成的哈希值中包含盐明文。这样您就可以将 hash 和 salt 存储到同一个数据库字段中。

    $2y$10$nOUIs5kJ7naTuTFkBy1veuK0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa
     |  |  |                     |
     |  |  |                     hash-value = K0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa
     |  |  |
     |  |  salt = nOUIs5kJ7naTuTFkBy1veu
     |  |
     |  cost-factor = 10 = 2^10 iterations
     |
     hash-algorithm = 2y = BCrypt
    

    为了验证,他们提供了一个 password_verify() 函数,该函数将从存储的哈希值中提取盐值,并使用相同的盐值对登录密码进行哈希处理。然后这两个哈希值是可比较的。

    哈希应该在服务器端完成,通常密码以明文形式发送到服务器,使用 HTTPS/SSL 加密。

    【讨论】: