PHP crypt()的输出长度是多少?

时间:2012-11-04 21:14:28

标签: php hash crypt

PHP crypt()的输出长度是多少?

md5()输出为128位并生成一个包含32个字符的字符串,因此在数据库中您将其放在char(32)列中,crypt()怎么样?

4 个答案:

答案 0 :(得分:20)

  

注意:完全限于以这种方式提问,请参阅http://php.net/crypt

更多细节:

  • 成功时,返回字符串的长度可以在13到123之间变化。
  • 输出长度取决于使用的哈希算法。在你的问题中它仍未定义。
  • 输出长度取决于传递给函数的salt。在你的问题中它仍未定义。
  • crypt始终返回散列字符串或短于13个字符的字符串,并且保证与失败时的盐不同。

示例:

让我们通过一个简单的crypt调用和一个有效的双字符盐来轻松启动标准的基于DES的哈希:

 13 :: 2 (salt) + 11 (hash - 64 bits, base 64)

如果您使用PHP的crypt,特别是MD5(此处更好地命名为:md5crypt,MD5(Unix),FreeBSD MD5,Cisco-IOS MD5; Hashcat模式500)和空盐,输出长度为:< / p>

 26 :: 3 (`$1$`) + 0 (empty salt) + 1 (`$`) + 22 (hash - 128 bits, base 64)

如果在PHP的crypt默认为所述MD5并且调用未指定salt的系统上,crypt将生成盐。这种盐通常是8个字符长。输出长度为:

 34 :: 3 (`$1$`) + 8 (salt) + 1 (`$`) + 22 (hash)

在这种情况下,您的数据库表列char(32)将报告插入或截断错误 - 具体取决于您使用的数据库服务器。

但MD5示例没有实际意义,我之所以选择它,是因为您在问题中已将其添加,但您不应将MD​​5与crypt一起使用(请参阅:Md5crypt Password scrambler is no longer considered safe by author)。

相反,我们来看看Blowfish散列(CRYPT_BLOWFISH)。它有一个两位数的成本参数,并且盐的长度始终为22(如果给出较短的盐,则用$填充):

 60 :: 4 (`$2y$`) + 3 (cost `$`) + 22 (salt) + 1 (`$`) + 53 (hash)

对于Blowfish crypt hash算法(bcrypt,OpenBSD Blowfish; Hashcat模式3200),固定长度为60。

正如您所看到的,输出长度取决于使用的哈希算法,盐的长度,甚至一些特定于哈希的参数,例如 cost

例如,如果你选择SHA512,999 999 999轮和16字节长盐,输出长度为:

123 :: 3 (`$6$`) + 17 (`rounds=999999999$`) + 16 (salt) + 1 (`$`) + 86 (hash)

这个例子可能有点极端,只是为了显示图片。


其他crypt相关问题:

答案 1 :(得分:0)

  

返回散列字符串或短于13的字符串   字符并保证与失败时的盐不同。

     

crypt()将使用基于标准Unix DES的方式返回散列字符串   可用的算法或替代算法   系统

     

某些操作系统支持多种类型的哈希。事实上,   有时基于标准DES的算法被基于MD5的算法取代   算法。哈希类型由salt参数触发。之前   5.3,PHP将根据系统的crypt()确定安装时的可用算法。如果没有提供盐,PHP会   自动生成标准的两个字符(DES)盐或十二个   字符(MD5),取决于MD5 crypt()的可用性。 PHP   设置一个名为CRYPT_SALT_LENGTH的常量,表示最长   可用的哈希值允许有效的盐。

了解详情:http://php.net/crypt

答案 2 :(得分:0)

正如您在documentation中所看到的,&#39;&#39;&#39; crypt()&#39;&#39;&#39;函数用于各种不同的散列算法。因此长度可以不同,并且取决于默认的散列算法,该算法可以由文档中描述的常量确定。

答案 3 :(得分:0)

crypt()依赖于可用的加密方法。 PHP最常用的方法是MD5,它总是返回32个字符。其他方法如DES和Blowfish返回可变长度的字符串。

您需要知道crypt()函数在您的服务器中使用的方法。