【发布时间】: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 的组件没有任何问题,只是实施不佳,没有经过适当的压力测试。于是一个无用的安全机制诞生了。除非您是安全专家,否则不要尝试自己动手。