- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
进一步my previous question about salted passwords in PHP/MySQL ,我还有一个关于盐的问题。
当有人说“使用随机盐”来预先/附加到密码时,这是否意味着:
如果每个用户的盐都是随机的,并与散列密码一起存储,那么如何检索原始盐以进行验证?
最佳答案
至少应为每个用户以及每次更改密码时随机生成一个新的盐。例如,不要仅仅依赖于站点范围的盐,因为这首先就违背了使用盐的意义。
为每个用户使用唯一的盐,这样如果两个用户具有相同的密码,他们将不会获得相同的结果哈希。这也意味着需要单独针对每个用户进行暴力攻击,而不是能够预先计算 rainbow table对于该网站。
然后,您将盐和密码的哈希结果存储在数据库中 hash(salt + password)
,以及 salt
对于每个用户。您可以将它们存储在单独的列中,或全部存储在一列中(由散列中未使用的某些字符分隔,例如;
)。只要你能把两个都找回来就没事了。
但是,如果您的数据库由于某人获得本地访问权限或通过 SQL 注入(inject)攻击而受到损害,那么盐和最终哈希都将可用,这意味着对用户密码的暴力攻击将是微不足道的。为了解决这个问题,按照The Rook的建议您还可以使用存储在本地文件中的站点范围 key 作为哈希方法的另一个输入,以便攻击者也需要知道这一点才能发动有效的攻击。这意味着您的数据库必须受到损害,并且攻击者需要访问本地文件。所以使用hash(hash(salt + secret) + password)
等
虽然在大多数算法中,您的目标是尽可能快,但对于密码散列,您希望减慢速度,这称为 Key Strengthening (或者有时是键拉伸(stretch))。如果您的哈希函数需要 0.00001 秒才能返回,那么有人可以尝试每秒暴力破解 100,000 个密码,直到找到匹配项。如果你的哈希函数需要 1 秒才能输出结果,那么对于登录你的应用程序的人来说这没什么大不了的,但对于破解密码来说这是一个更大的问题,因为现在每次尝试都需要 1 秒才能获得结果结果,这意味着测试每个暴力破解密码所需的时间是使用原始哈希函数的 100,000 倍。
要使哈希函数变慢,您只需运行它多次即可。例如,您可以这样做 new_hash = salt + password + previous_hash
10万次。如果迭代速度太快,您可能需要将迭代次数调整为更高的值。如果您希望以后能够更改该值,请确保将迭代次数与用户记录一起存储,这样就不会影响之前存储的任何密码。
您的用户记录现在应该有一个格式类似于“$<algorithm>$<iterations>$<salt>$<hash>
”的字段(如果需要,也可以作为单独的字段)。
当用户输入密码时,您可以从数据库检索盐和迭代次数,并从本地文件检索站点范围的 secret ,并验证当您使用盐和密码运行相同次数的迭代时,结果哈希与您存储的内容匹配。
如果用户更改了密码,那么您应该生成一个新的盐。
您使用的哈希方法并不重要(但哈希算法很重要*)。上面我建议hash(hash(salt + secret) + password)
但同样可以是 hash(hash(salt) + hash(secret) + hash(password))
。您使用的方法不会改变密码存储的有效性,一种方法并不比另一种方法更安全。依靠如何将密码和盐一起散列来提供安全性的设计称为 security through obscurity应避免。
*您不应使用 MD5 或 SHA-1,因为它们被认为是不安全的。请改用 SHA-2 系列(SHA256、SHA512 等)。 (Ref)
关于security - 每个密码需要一次 "random salt"还是每个数据库只需要一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2999197/
在设置了 salt-master 和一个 minion 后,我可以接受 master 上的 key 。运行 sudo salt-key -L表明它被接受。但是,当我尝试使用 test.ping 时命令
当我使用管道运行任何命令或在其中重定向时,它会失败。 master 和 minion 都在为测试 Salt 而创建的 Digital Ocean 上的新 Ubuntu 14.04 机器上运行。 两者都
这里的 Salt 中 [] 是什么意思? httpd: pkg.installed: [] file.managed: - name: /etc/httpd/conf/httpd.co
我正在寻找一种简单的方法来获取有关内存使用情况的信息,例如盐小兵的空闲内存。 到目前为止,我知道可以使用salt '*' grains.items列出总内存,但是我什至不知道如何仅列出总内存而不是所有
在 Saltstack 中,我有以下用例: 有一个状态 redis.sls 可以被其他状态包含。 redis.sls 的结果应该根据包含 redis.sls 的状态进行不同的配置。 例如: redis
我有一个带有盐状态的存储库,用于在云中配置我的服务器集群。随着时间的推移,我不断添加更多状态 - .sls文件 - 进入这个 repo。现在我开始挣扎什么是什么,什么是哪里。 我想知道是否有一些软件实
有没有办法加入两个支柱文件? 我有一个用户支柱。它是这样的: users: joe: sudouser: True jack: sudouser: False 现在我需要为某些
我在家庭实验室中使用 Saltstack,在测试它们时,我经常发现自己检查了一些稍有破坏的规则。我希望能够检查它们的有效性,否则在本地和 Jenkins 实例上对它们进行 lint,但我找不到任何有关
我有一个场景,如果另一个服务已经在运行,我需要采取行动。具体来说,我想安装 snmp 监控,例如,如果 mysql 已经在运行。 我知道这样做的“正确”方法是安装 mysql 及其基于支柱数据、gra
我正在尝试构建一个总是会重启服务的 .sls 文件: systemd-resolved: service.running: - restart: True 部署后,这会给出 I
(这是我在 salt 用户组 FWIW 上提出的问题的副本) 我需要编写一个状态来安装一些Windows服务器功能,重新启动minion,然后安装更多软件。似乎所有的部分都在那里(cmd.wait、s
“salt”在字符串到键 (s2k) 说明符中指什么? 它似乎是一个随机数生成器,可以改变事物,但我想知道“盐”代表什么? 例如这样写: 3.6.1.2. Salted S2K This inc
我正在尝试构建一个总是会重启服务的 .sls 文件: systemd-resolved: service.running: - restart: True 部署后,这会给出 I
我有一个 AWS 设置,其中有一个指定的 salt master,它接受所有传入的 key 和基于子网/指定 ip 地址的规定。如何在不登录主服务器的情况下立即在连接时配置我的 minions? 最佳
我想要一个 Salt 状态来管理我的 SSH 文件。这需要多个 file.line操作。我怎样才能做到这一点? 更新:请参阅问题底部以了解我当前的解决方法 我有的是这个: Secure SSH:
我正在验证用户电子邮件地址。 大多数人告诉的方式是创建一些独特的 token 并将其存储在 db 中 发送给用户。 我只是用全站盐散列(sha256)电子邮件地址来做这件事 并将此哈希发送给用户。 我
国家file.managed has defaults和 context模板渲染选项。两者都为模板变量提供上下文。 它们之间有什么区别? 最佳答案 defaults是在 context 情况下将传递给
我刚开始使用 Salt 而不是 Ansible。我不确定是从 master 调用以下脚本还是手动将命令输入 salt 状态。对于后者,任何人都可以建议如何使用 cmd.run 实现此目的。 #!/bi
我刚开始使用 Salt 而不是 Ansible。我不确定是从 master 调用以下脚本还是手动将命令输入 salt 状态。对于后者,任何人都可以建议如何使用 cmd.run 实现此目的。 #!/bi
我用了一个月的 salt 。每当我运行命令说 sudo salt '*' test.ping 时,master 就会对所有 minions 执行 ping 操作,响应是所有已启动并正在运行的 mini
我是一名优秀的程序员,十分优秀!