当您尝试登录时,网站如何知道使用什么盐

How does a website know what salt to use when you try to login

例如,假设我的密码是 "foo" 并且该网站在密码上使用 md5 散列并附加了一个唯一的盐。

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

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

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

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

  1. 用户使用密码注册。
  2. 为他们的用户 ID 创建了一条新的数据记录(可以以用户名或电子邮件等形式出现)
  3. 他们的密码处理方式:
    1. 为他们生成盐,并将该盐保存在数据记录中。这很常见,建议在密码哈希旁边显示盐。
    2. 密码与盐相结合(通常情况下,库会为您处理这一步,因为像添加盐这样的细微差别在安全方面非常重要)。
    3. 使用专为密码哈希设计的函数对密码进行哈希处理。这通常在计算上非常昂贵,以挫败蛮力尝试。
    4. 密码哈希存储在数据记录中,原始密码被丢弃。

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

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

一些注意事项:

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