我使用crypt如下:
$pass = crypt($pass, 'd4');
用于插入和验证mysql表的密码。问题是如果密码相似,它会产生类似的结果。是否有算法可以保证不同密码的结果不同?
答案 0 :(得分:4)
使用hash()
并选择适合您的哈希算法(如果可能的话,比MD5强,但不要一直到SHA512)
在crypt()
的手册页上,您会找到:
标准的基于DES的crypt()将salt作为前两个返回 输出的字符。它也只使用前八个字符 str,所以更长的字符串以相同的八个字符开头 将产生相同的结果(当使用相同的盐时)。
这可以解释为什么你得到相同的结果。
答案 1 :(得分:2)
只要您不使用旧的基于DES的模式(CRYPT_STD_DES
),就可以使用crypt()
。使用它的唯一有效理由是与使用此类密码哈希的传统软件的互操作性。
而是使用CRYPT_BLOWFISH
,CRYPT_SHA256
或CRYPT_SHA512
模式。这些是现代密码哈希算法,可以接受任意长的密码,使用长盐并通过多次迭代支持密钥加强。
不幸的是,PHP crypt()
接口有些尴尬:明确选择所需算法的唯一方法是提供格式正确的$salt
参数,这意味着您还必须生成实际的盐你自己。但是,这可能比滚动自己的密码哈希码更容易,更安全。
答案 2 :(得分:1)
你可以加盐。通常情况下,如果您要存储密码,则需要对它们进行哈希处理,而不是加密它们。如果您搜索它(例如在谷歌上),您可以学到很多东西。
答案 3 :(得分:1)
:
标准的基于DES的crypt()返回salt作为输出的前两个字符。它也只使用str的前八个字符,因此以相同的八个字符开头的较长字符串将产生相同的结果(当使用相同的salt时)。
您可能还想使用不同的隐藏方法,例如MD5或SHA256,因为它们通常比DES更受欢迎。