【问题标题】:What is the output length of PHP crypt()? [closed]PHP crypt() 的输出长度是多少? [关闭]
【发布时间】:2012-10-24 18:01:07
【问题描述】:

PHPcrypt()的输出长度是多少?

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

【问题讨论】:

    标签: php hash crypt


    【解决方案1】:

    注意: 以这种方式提问是完全受限的,见http://php.net/crypt

    更多细节:

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

    例子:

    让我们从一个简单的crypt 调用和一个有效的基于 DES 的哈希的有效的两字符盐开始:

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

    如果您使用 PHP 的 crypt,特别是 MD5(这里更好地命名为:md5crypt、MD5(Unix)、FreeBSD MD5、Cisco-IOS MD5;Hashcat 模式 500)和一个空 salt,则输出长度为:

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

    如果在 PHP 的 crypt 默认为上述 MD5 并且它被称为未指定盐的系统上,crypt 将生成盐。这种盐的长度通常为 8 个字符。那么输出长度为:

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

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

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

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

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

    对于 Blowfish crypt hash-algorithm (bcrypt, OpenBSD Blowfish; Hashcat mode 3200),固定长度为 60。

    如您所见,输出长度取决于所使用的散列算法、盐的长度,甚至一些散列特定参数,例如 cost

    例如,如果您选择具有 999 999 999 轮和 16 字节长的盐的 SHA512,则输出长度为:

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

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


    其他crypt相关问题:

    【讨论】:

    • @Gumbo 这个答案有什么问题?
    • 我希望得到更多解释。例如,返回的字符串是如何构造的,输入如何影响输出。
    【解决方案2】:

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

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

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

    阅读更多:http://php.net/crypt

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2014-07-30
          • 2014-07-22
          • 2016-07-14
          • 2013-04-04
          • 2010-09-16
          • 2015-09-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多