我不确定在散列时crypt()使用哪种算法。我查看了PHP手册,但它只是说它使用了所有可用的东西。但我如何知道它使用哪一个,如果它确实使用了一个,如何告诉它使用哪一个?我目前使用MAMP作为我的开发环境,但我认为必须有一种方法可以在PHP中找到一个语句。
答案 0 :(得分:10)
您将算法指定为salt字符串的一部分。例如,从$2a$
开始为您提供Blowfish密码。如果机器不支持您尝试使用的算法,则无法获得有意义的结果。您可以通过检查某些预定义常量(例如CRYPT_BLOWFISH
)来尝试预先找出支持哪些算法,尽管我注意到常量CRYPT_SHA256
和CRYPT_SHA512
并不总是被定义,至少在PHP 5.2上。从PHP 5.3开始,PHP有自己的算法实现,因此在PHP编译时系统可用的内容与在PHP 5.2及更早版本中一样无关紧要。据推测,PHP 5.2的Suhosin补丁至少增加了Blowfish,但它的实现似乎与PHP 5.3中使用的补丁不兼容。
PHP docs for the crypt()
function确实提供了有关如何使用salt字符串指定使用哪种算法的一些信息:
- CRYPT_STD_DES - 标准的基于DES的哈希,带有两个字符的salt 来自字母" ./ 0-9A-Za-z"。在salt中使用无效字符 会导致crypt()失败。
- CRYPT_EXT_DES - 基于DES的扩展 哈希值。 "盐"是一个9个字符的字符串,由下划线组成 接着是4个字节的迭代计数和4个字节的盐。这些是 编码为可打印字符,每个字符6位,最少 首先是重要人物。值0到63编码为 " ./ 0-9A-ZA-Z&#34 ;.在salt中使用无效字符将导致crypt() 失败。
- CRYPT_MD5 - 带有十二个字符盐的MD5哈希值 以$ 1 $
开头- CRYPT_BLOWFISH - 用盐腌制河豚 如下:" $ 2a $",两位数的成本参数," $"和来自的22位数字 字母" ./ 0-9A-Za-z"。使用此范围之外的字符 salt将导致crypt()返回零长度字符串。他们俩 digit cost参数是迭代计数的base-2对数 对于基于Blowfish的哈希算法,必须在 范围04-31,超出此范围的值将导致crypt()失败。
- CRYPT_SHA256 - SHA-256哈希,前缀为16个字符的盐 5美元。如果盐字符串以' rounds = $'开头,则为数字 N的值用于表示散列循环应该多少次 被执行,就像Blowfish上的成本参数一样。默认 轮数为5000,最小为1000,最大为 999,999,999。在该范围之外的任何N的选择都将被截断 到最近的限制。
- CRYPT_SHA512 - 带有十六个的SHA-512哈希 字符盐前缀$ 6 $。如果盐串开始 ' rounds = $',N的数值用于表示多少 应该执行散列循环的次数,就像成本一样 Blowfish上的参数。默认的轮数是5000,有 至少1000,最大999,999,999。任何N的选择 超出此范围将被截断为最接近的限制。
所以,要指定你想要字符串"密码"使用Blowfish进行2 ^ 10次迭代,您可以使用
crypt('password', '$2a$10$XA86t7EJ0xD9OYEUbnTulT');
以XA86
开头的字符串是盐。
最后,如果您想要更多示例或者只是想要一些事情来处理所有这些密码兼容性业务,请查看phpass。它是公共领域,在我的经验中运作良好。它将自动使用" best"系统上的算法,除非你指定你想要一个与多个系统兼容的哈希,在这种情况下(我认为)它使用MD5。