如何找出crypt()在您的机器上使用的算法?

And*_*ndy 8 php hash mamp

我不确定在散列时crypt()使用哪种算法.我查看了PHP手册,但它只是说它使用了所有可用的东西.但我怎么知道它使用哪一个,如果它确实使用了一个,如何告诉它使用哪一个?我目前使用MAMP作为我的开发环境,但我认为必须有一种方法可以找到PHP中的语句.

And*_*rew 11

您将算法指定为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文档crypt()确实提供了有关如何使用salt字符串指定要使用的算法的一些信息:

  • CRYPT_STD_DES - 标准的基于DES的哈希,带有来自字母"./0-9A-Za-z"的双字符盐.在salt中使用无效字符将导致crypt()失败.
  • CRYPT_EXT_DES - 基于DES的扩展哈希."salt"是一个9个字符的字符串,由下划线后跟4个字节的迭代计数和4个字节的盐组成.它们被编码为可打印字符,每个字符6位,最不重要字符.值0到63编码为"./0-9A-Za-z".在salt中使用无效字符将导致crypt()失败.
  • CRYPT_MD5 - MD5哈希,带有12个字符的盐,以$ 1 $开头
  • CRYPT_BLOWFISH - 带有盐的河豚散列如下:"$ 2a $",两位数的成本参数"$",以及字母"./0-9A-Za-z"的22位数字.在salt中使用此范围之外的字符将导致crypt()返回零长度字符串.两位数的成本参数是底层基于Blowfish的散列算法的迭代计数的基数2对数,并且必须在04-31范围内,超出此范围的值将导致crypt()失败.
  • CRYPT_SHA256 - 带有16个字符盐的SHA-256哈希,前缀为$ 5 $.如果salt字符串以'rounds = $'开头,则N的数值用于指示应该执行散列循环的次数,就像Blowfish上的cost参数一样.默认轮数为5000,最小值为1000,最大值为999,999,999.在此范围之外的任何N的选择将被截断为最接近的限制.
  • CRYPT_SHA512 - SHA-512哈希,带有前缀为$ 6 $的16个字符的盐.如果salt字符串以'rounds = $'开头,则N的数值用于指示应该执行散列循环的次数,就像Blowfish上的cost参数一样.默认轮数为5000,最小值为1000,最大值为999,999,999.在此范围之外的任何N的选择将被截断为最接近的限制.

因此,要指定您希望使用Blowfish进行2 ^ 10次迭代的字符串"password"哈希,​​您可以使用

crypt('password', '$2a$10$XA86t7EJ0xD9OYEUbnTulT');
Run Code Online (Sandbox Code Playgroud)

以字符串开头的XA86是盐.

最后,如果您想要更多示例或者只是想要一些事情来处理所有这些密码兼容性业务,请查看phpass.它是公共领域,在我的经验中运作良好.它将自动使用系统上的"最佳"算法,除非您指定需要与多个系统兼容的哈希,在这种情况下(我认为)它使用MD5.