【问题标题】:Warning: mcrypt_encrypt(): key of size 10 not supported by this algorithm. only key of size 16, 24 or 32 supported警告:mcrypt_encrypt():此算法不支持大小为 10 的密钥。仅支持大小为 16、24 或 32 的密​​钥
【发布时间】:2016-07-22 22:21:32
【问题描述】:

我正在尝试使用mcrypt_encrypt() 加密密码。它在localhost 上运行良好,但是当我上线时,我的输出是"",我收到了这个警告:

警告:mcrypt_encrypt():不支持大小为 10 的密钥 这个算法。仅支持大小为 16、24 或 32 的键

这是我正在使用的代码:

$text="thisismypassword123";
$salt="1234567824";
return trim (
    base64_encode (
        mcrypt_encrypt (
            MCRYPT_RIJNDAEL_256, $salt, $text, MCRYPT_MODE_ECB, mcrypt_create_iv (
                mcrypt_get_iv_size (
                    MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB
                ),
                MCRYPT_RAND
            )
        )
    )
);

这可能是什么原因,我可以做些什么来解决这个问题?

【问题讨论】:

  • 请不要使用 MCRYPT_MODE_ECB 模式,因为不会使用盐。使用 MCRYPT_MODE_CBC。使用“openssl_”加密例程比使用mcrypt 更可靠。
  • 考虑接受有帮助的答案。要接受答案,请单击最佳答案旁边的空心复选标记,这样做会提高您的声誉并提供更多功能,请参阅reputation faq 更多详细信息,请参阅this page。另外请考虑返回并接受过去的答案,这样做会增加您的声誉并允许更多功能,请参阅reputation faq

标签: php encryption mcrypt password-encryption encryption-symmetric


【解决方案1】:

解决向后兼容性的简单方法是用 \0 填充当前密码。

例如,对于您当前在 PHP 5.4 上的 $key = "1234567890",由于当前密钥大小为 10,它将在 PHP 5.6 版本上停止工作。

要在不影响应用程序的情况下解决它,只需更改为 $key = "1234567890\0\0\0\0\0\0" (直到达到 1632强>,...)

【讨论】:

    【解决方案2】:

    在 PHP 5.6 及更高版本中,您的$salt 必须是16、24 或32 个字符长的随机字符串。您的本地主机可能仍在使用旧版本的 PHP。

    这段代码应该在本地主机和你的服务器上都可以工作:

    $text="thisismypassword123";
    $salt="ddv21sd5dv56sd51"; // <- 16 characters long
    return trim (
        base64_encode (
            mcrypt_encrypt (
                MCRYPT_RIJNDAEL_256, $salt, $text, MCRYPT_MODE_ECB, mcrypt_create_iv (
                    mcrypt_get_iv_size (
                        MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB
                    ),
                    MCRYPT_RAND
                )
            )
        )
    );
    

    注意

    即使此代码工作,您可能还需要考虑其他问题。

    请参阅其他答案(尤其是Scott Arciszewski 的答案),详细了解您的代码还有什么问题以及为什么您甚至不应该首先使用mcrypt_encrypt()!强>

    【讨论】:

    • 请不要使用MCRYPT_MODE_ECB模式,因为不会使用盐。
    • @RyanVincent :你会推荐什么来替代MCRYPT_MODE_ECB
    • @RyanVincent:那你在说什么?您对MCRYPT_MODE_ECB 有什么建议?
    • 对不起,1) 不要使用mcrypt。 2)如果你这样做,那么使用:MCRYPT_MODE_CBC。 3) 我建议使用openssl_ 对称函数而不是mcrypt。也许很有趣: : thefsb.tumblr.com/post/110749271235/…
    • 如果你想要一个库,那么:github.com/defuse/php-encryption 绰绰有余,但需要 PHP 5.4 或更高版本。
    【解决方案3】:

    我正在尝试加密密码

    This is probably a mistake。您将密钥称为“盐”这一事实使我更加警惕。需要存储用户密码? 加密 不是适合这项工作的工具。 密码散列是。 They're wildly different concepts.

    但是让我们忽略“错误的工作工具”方面并假设您出于某种原因加密了非密码字符串。即使在这种情况下,您的加密代码也是不安全的。

    return trim ( // Why are you trimming this?
        base64_encode (
            mcrypt_encrypt (
                MCRYPT_RIJNDAEL_256, // Not AES
                $salt,
                $text,
                MCRYPT_MODE_ECB,     // The WORST mode possible
                mcrypt_create_iv (   // ECB mode doesn't use an IV
                    mcrypt_get_iv_size (
                        MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB
                    ),
                    MCRYPT_RAND      // Even if an IV was used, MCRYPT_RAND
                                     // is a bad choice! Use MCRYPT_DEV_URANDOM
                )
            )
        )
    );
    

    即使您解决了上述问题,您还有一个更严重的问题:Chosen-ciphertext attacks

    解决方案:

    你能告诉给你代码 sn-p 的人,他们正在互联网上传播不安全的代码吗?谢谢。

    【讨论】:

    • 只是为了阐明为什么这如此不安全。我有一些与此非常相似的遗留代码,原因是旧版本的 MySQL 使用 AES_ENCRYPT 函数。此代码是您在 PHP 中复制 MySQL 加密的方式。
    • 如果您需要它用于“迁移到安全加密”项目,那很好。不要依赖它。您可以完全放弃 mcrypt_create_iv() 函数调用并加快速度。
    【解决方案4】:

    警告有什么不清楚的地方?提供大小可接受的密钥。

    密钥就是你所说的$salt,它不是盐,它是加密密钥。重命名,让代码更清晰。

    某些实例可能会向键添加填充字节,但这是非标准的,并且对于不同的实现可能会有所不同。不信任参数填充,指定全长。

    同样来自加密文档:

    MCRYPT_RIJNDAEL_256 不是 AES-256,它是 Rijndael 分组密码的不同变体。如果您想在 mcrypt 中使用 AES-256,则必须使用 MCRYPT_RIJNDAEL_128 和 32 字节密钥。

    您应该使用 AES 选项。

    代码使用不安全的 ECB 模式,不应使用也不使用 IV。可能您想要做的是使用需要 IV 的 CBC 模式。解密需要相同的 IV。

    应该不需要trimBase64编码。

    最后,嵌套多级函数(这里是 6 个)似乎是个好主意,但由于无法检查中间结果,因此几乎无法进行调试。

    然后是mcrypt,最好不要用mcrypt,它是废弃软件,多年没更新不支持标准PKCS#7填充,只有非标准的空填充,甚至不能与二进制数据一起使用。而是考虑使用defuse,它正在维护中并且是正确的。

    【讨论】:

      猜你喜欢
      • 2016-11-25
      • 2016-11-03
      • 2018-07-11
      • 1970-01-01
      • 2015-05-10
      • 2015-03-13
      • 2017-08-28
      • 2015-09-16
      • 2021-12-05
      相关资源
      最近更新 更多