Php 腌制和拉伸

Php 腌制和拉伸,php,security,hash,md5,sha1,Php,Security,Hash,Md5,Sha1,可能的重复项: 在阅读最近一篇关于密码散列的回答时,虽然我已经熟悉了其中解释的大部分技术,但我的脑海中突然出现了一些疑问——其中最相关的是如果我们拉伸(多次散列)我们的散列,为什么盐腌很重要? 例如,如果我们使用字符串“password”并应用1000次SHA-1哈希迭代,我们最终得到的结果是“862e52b42b26c0f7e2b6ef5f635226bf0fd3f7fb”,如果我们只对其进行一次哈希,则与“5baaa61e4c9b93f3f068250b6cf8331b7ee68fd8”

可能的重复项:

在阅读最近一篇关于密码散列的回答时,虽然我已经熟悉了其中解释的大部分技术,但我的脑海中突然出现了一些疑问——其中最相关的是如果我们拉伸(多次散列)我们的散列,为什么盐腌很重要?

例如,如果我们使用字符串“
password
”并应用1000次SHA-1哈希迭代,我们最终得到的结果是“
862e52b42b26c0f7e2b6ef5f635226bf0fd3f7fb
”,如果我们只对其进行一次哈希,则与“
5baaa61e4c9b93f3f068250b6cf8331b7ee68fd8
”非常不同。这些迭代难道不也算作一种盐渍的平均值吗?在第二次迭代中,我们已经在散列一个40个字符长的字符串,这意味着攻击者必须确定我们使用了多少次迭代(类似地,攻击者也可以猜测我们的秘密盐),或者生成一个包含所有1461 501 637 330 902 918 203 684 832 716 283 019 655 932 542 976组合的彩虹表(
16^40

关于腌制的其他问题:

  • 你使用静态盐还是动态盐?为什么
  • 如果您使用nonce,您将其设置为多大,以及将其存储在何处(前缀、列等)
  • 我理解使用nonce而不是静态(长)salt的额外好处,但我无法想象攻击者会付出必要的努力来成功完成暴力匹配(我认为他们更可能在这之前发现散列冲突)此外,如果我们使用nonce散列,我们需要向数据库发出两个查询,而不是一个查询(一个用于获取nonce以便我们可以计算散列,另一个用于检查散列)。老实说,我不理解为什么仅拉伸不被认为是“安全的”


    还有,为什么有这么多人采用SHA>1实现?SHA-1还不安全吗?新闻应用程序是否应该使用最新的SHA实现来散列敏感数据?当“旧”时会发生什么仍在使用MD5/SHA-1的应用程序需要将其哈希迁移到更新的实现?

    您应该尝试将其分解为许多单独的问题。