【问题标题】:What should be the minimum length of a salt and is it always unique with openssl_random_pseudo_bytes盐的最小长度应该是多少,并且在 openssl_random_pseudo_bytes 中总是唯一的
【发布时间】:2016-05-03 04:18:34
【问题描述】:

我正在努力以安全的方式将我的用户密码存储在我的数据库中。我读了一点,有人建议我使用 openssl_random_pseudo_bytes 来生成我的盐。我愿意:

bin2hex(openssl_random_pseudo_bytes($thenumberIwanttouse, $cstrong));

它有效,但我在徘徊两件事:

-我的盐的长度应该是多少,在我的数据库中,如果我的盐有 30 个字符,例如,我只需要一个长度为 30 的 varchar 字段?

-openssl_random_pseudo_bytes 是否总是会生成新的 salt?如果不是,是否意味着我需要将我的 salt 与数据库中的所有其他现有 salt 进行比较以确保没有任何重复?

【问题讨论】:

  • 使用password_hash()password_verify() 他们是推荐的方法,不要加盐他们自己做。 不要重新发明轮子,尤其是在这个领域,手动操作的安全性更有可能是错误的,而不是正确的实施。 See the Manual
  • 如果你生成随机字节,那么不要使用 varchar/text-type 字段。随机字节可以/将随机包含看似有效的 unicode 字符序列,并且 varchar/text 字段受字符集转换的影响。这可能会通过进行错误的字符翻译来破坏盐的字节。请改用 blob/varbinary 类型的字段。
  • 那我应该使用什么样的字段呢?
  • 如果 password_hash() 自己加盐,他们如何记住他们使用的盐?盐不需要在数据库中吗?
  • 请记住,无线路由器安全机制 WEP 的组件没有任何问题,只是实施不佳,没有经过适当的压力测试。于是一个无用的安全机制诞生了。除非您是安全专家,否则不要尝试自己动手。

标签: php database salt


【解决方案1】:

salt 的原始格式长度为 16 个字节,它不是十六进制编码的。 但是,您不应该自己生成它,也不应该在数据库中有单独的盐字段!

password_hash() 会自动生成一个盐(它会比你做得更好),然后将它存储在哈希本身中——这就是算法的工作原理。

除了 password_hash()password_verify() 之外,您不应该使用任何东西来使整个事情正常工作。

此外,openssl_random_pseudo_bytes() 有更好的替代方案来生成随机数据,例如 PHP7 下的 random_bytes(),或者它是旧 PHP 版本的反向移植 - random_compat 包。

【讨论】:

  • 问题是,我在读这个:crackstation.net/hashing-security.htm#normalhashing。在我看来,那个人真的知道我在做什么,但是在 php 中,我真正需要的只是 password_hash() 和 password_verify() 吗?即使在我学习的时候,我也被告知将盐存储在我的数据库中,但是在这个中,将盐粘贴到某个 php 函数中......我怎么知道谁是真正的 wright?
  • 我不是已经在我的 cmets 中说过这个没有人喜欢评论骗子!
  • 我发这个帖子时你还没有写评论。
  • @KévinDuguay 是的,在 PHP 下,您只需要 password_hash()password_verify()。您链接到的文章确实是由知道他们在做什么的人写的,但这不是关于如何在 PHP 下进行密码哈希的教程。
  • @Narf 评论 21 分钟前,你的帖子 11 分钟前基本数学
猜你喜欢
  • 2010-09-16
  • 1970-01-01
  • 2020-09-27
  • 2015-06-10
  • 2012-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
相关资源
最近更新 更多