首页 > 解决方案 > 当您尝试登录时,网站如何知道使用什么盐

问题描述

例如,假设我的密码是“foo”,并且网站对密码使用 md5 哈希,并附加了唯一的盐。

因此,当我注册时,我的密码将存储为“foo”,并附加一个盐,然后进行 md5 哈希处理。

然后,当我发送登录请求时,网站会将盐附加到“foo”,然后 md5 对其进行哈希处理,但是网站如何知道要使用的正确唯一盐是什么?

网站如何神奇地知道要附加到我的密码的正确唯一盐,然后对我的密码进行 md5 散列,以验证我输入的密码等于数据库中的 md5 散列加盐密码?

标签: hashsalt

解决方案


这是处理密码的通常过程:

  1. 用户使用密码注册。
  2. 为其用户 ID 创建一个新的数据记录(可以是用户名或电子邮件等形式)
  3. 他们的密码被处理:
    1. 为它们生成盐,并将盐保存在数据记录中。这是很常见的,建议盐在密码哈希旁边可见。
    2. 密码与盐结合在一起(通常,库甚至会为您处理这一步,因为像附加盐这样的任何细微差别对安全性都很重要)。
    3. 使用为密码散列设计的函数对密码进行散列。这通常在计算上非常昂贵,无法阻止蛮力尝试。
    4. 密码哈希存储在数据记录中,原始密码被丢弃。

然后当他们登录时,这里没有魔法:

  1. 使用他们的用户 ID 查找数据记录。
  2. 他们提供的密码与数据记录中的盐相结合,然后进行哈希处理。
  3. 如果它与存储的哈希匹配,则授予他们访问权限。

一些注意事项:

  • 密码散列很昂贵。我认为计算时间超过 1 秒的情况并不少见。想象一下,如果一千个人同时登录,处理负载。
  • 如果您没有使用像样的库来处理密码哈希,很多事情都会出错。不建议您自己编写任何步骤。
  • 库通常会输出一个编码字符串,其中包含您需要验证密码的所有内容,例如版本代码、哈希和使用的盐。

推荐阅读