hash - 当您尝试登录时,网站如何知道使用什么盐
问题描述
例如,假设我的密码是“foo”,并且网站对密码使用 md5 哈希,并附加了唯一的盐。
因此,当我注册时,我的密码将存储为“foo”,并附加一个盐,然后进行 md5 哈希处理。
然后,当我发送登录请求时,网站会将盐附加到“foo”,然后 md5 对其进行哈希处理,但是网站如何知道要使用的正确唯一盐是什么?
网站如何神奇地知道要附加到我的密码的正确唯一盐,然后对我的密码进行 md5 散列,以验证我输入的密码等于数据库中的 md5 散列加盐密码?
解决方案
这是处理密码的通常过程:
- 用户使用密码注册。
- 为其用户 ID 创建一个新的数据记录(可以是用户名或电子邮件等形式)
- 他们的密码被处理:
- 为它们生成盐,并将盐保存在数据记录中。这是很常见的,建议盐在密码哈希旁边可见。
- 密码与盐结合在一起(通常,库甚至会为您处理这一步,因为像附加盐这样的任何细微差别对安全性都很重要)。
- 使用为密码散列设计的函数对密码进行散列。这通常在计算上非常昂贵,无法阻止蛮力尝试。
- 密码哈希存储在数据记录中,原始密码被丢弃。
然后当他们登录时,这里没有魔法:
- 使用他们的用户 ID 查找数据记录。
- 他们提供的密码与数据记录中的盐相结合,然后进行哈希处理。
- 如果它与存储的哈希匹配,则授予他们访问权限。
一些注意事项:
- 密码散列很昂贵。我认为计算时间超过 1 秒的情况并不少见。想象一下,如果一千个人同时登录,处理负载。
- 如果您没有使用像样的库来处理密码哈希,很多事情都会出错。不建议您自己编写任何步骤。
- 库通常会输出一个编码字符串,其中包含您需要验证密码的所有内容,例如版本代码、哈希和使用的盐。
推荐阅读
- azure - 在 Azure 将我锁定在虚拟机之外并强制我重置密码后,发布到 Azure 失败
- zabbix - 衡量 Zabbix 带宽消耗的最佳方法是什么?
- javascript - FormData 附加文件 Angular
- javascript - Parse Server Parse.User.current() 返回所有用户数据
- html - 块级元素相互重叠
- regex - 使用 [] 的扩展正则表达式中的顺序是否重要?
- xml - xsl:for-each 设置为单个变量?
- php - 在嵌套循环中从父级获取值
- php - 使用 PHP 和 AJAX 从数据库中提取大数据
- java - 创建 log4j2 记录器会导致在启动 Tomcat webapp 时检索 JNDI 命名上下文失败