0

我试图使用mcrypt_encrypt()加密密码。它是在localhost工作正常,但是当网上去,我的输出是""和我得到这样的警告:警告:此算法不支持mcrypt_encrypt():大小为10的密钥。只有大小为16,24或32的密钥支持

警告: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 
      ) 
     ) 
    ) 
); 

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

+2

请不要使用MCRYPT_MODE_ECB模式,因为盐不会被使用。使用MCRYPT_MODE_CBC。使用'openssl_'加密例程而不是'mcrypt'更可靠。 –

+0

考虑接受有用的答案。 要接受答案,请点击最佳答案旁边的空白复选标记,这样做会增加您的声望并提供更多功能。请参阅[声誉常见问题](http:// stackoverflow。com/faq#reputation)请参阅[本页](http://meta.stackoverflow.com/questions/5234/how-does-accepting-an-answer-work)了解更多详情。 另外请考虑回去和接受过去的答案,这样做会增加你的声望,并允许更多的功能,请参阅[声誉常见问题](http://stackoverflow.com/faq#reputation) – zaph

回答

2

有什么不清楚的警告?提供可接受尺寸的钥匙。

关键是你所说的$ salt,它不是盐,它是加密密钥。重命名它以使代码更清晰。

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

另外,从第加密文档:

MCRYPT_RIJNDAEL_256不是AES-256,它是Rijndael的块密码的不同变体。如果您需要mcrypt中的AES-256,则必须使用带有32字节密钥的MCRYPT_RIJNDAEL_128。

您应该使用AES选项。

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

应该不需要trim Base64编码。

最后,嵌套几个级别的函数(这里是6)似乎是一个好主意,但它使调试几乎不可能,因为不能检查中间结果。

然后有mcrypt,最好不要使用mcrypt,它是弃用的,多年未更新,不支持标准的PKCS#7填充,只有非标准的null填充甚至不能使用与二进制数据。请考虑使用defuse,它正在维护和正确。

-1

在PHP 5.6及更高版本中,您的$salt需要为或16,24或32个字符的随机字符串。您的localhost可能仍然使用旧版本的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()

+2

请不要使用'MCRYPT_MODE_ECB'模式因为盐不会被使用。 –

+0

@RyanVincent:你会推荐什么来替代“MCRYPT_MODE_ECB”? –

+0

@RyanVincent:那你在说什么?你对'MCRYPT_MODE_ECB'提出了什么建议? –

4

我试图加密密码

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

解决方案:

你能告诉谁给你的代码片段,他们正在互联网上传播不安全的代码?谢谢。

2

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

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

为了解决它,而不应用任何影响只是改变为$键= “1234567890 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0”(直到达到或,...)

相关问题