【问题标题】:CodeIgniter encrypt decode not workingCodeIgniter 加密解码不起作用
【发布时间】:2017-11-10 20:33:05
【问题描述】:

我使用 CodeIgniter 加密库,一切正常,但现在我已将项目移至新服务器,它简单地停止工作。

这个简单的测试:

$this->load->library('encrypt');
$str = '12345';
$key = 'my-secret-key';
$encrypted = $this->encrypt->encode($str, $key);
var_dump($encrypted);
var_dump($this->encrypt->decode($encrypted, $key));
die();

它的回归:

string(76) "v9kMgDy+MUHgu5ug6N2qWms0/6tJ+a9N86kmpNvwkKI4nU8yL93kkAH1bmhn57ADh8WGB64i18E="
A PHP Error was encountered

Severity: Warning

Message: mcrypt_decrypt(): Received initialization vector of size 38, but size 32 is required for this encryption mode

Filename: libraries/Encrypt.php

Line Number: 346

string(0) ""

(PHP 错误/警告仅有时出现)

谢谢

【问题讨论】:

  • 最好不要使用mcrypt,它是废弃软件,多年未更新,不支持标准PKCS#7(née PKCS#5)填充,只有非标准空填充可以'甚至不能与二进制数据一起使用。 mcrypt 有许多出色的 bugs 可以追溯到 2003 年。不推荐使用的 mcrypt-extension 将在 PHP 7.2 中删除。而是考虑使用defuseRNCryptor,它们提供了完整的解决方案并且正在维护中并且是正确的。
  • 你真的不应该使用$this->load->library('encrypt');。请改用$this->load->library('encryption');

标签: php codeigniter encryption


【解决方案1】:

始终使用精确长度的密钥(AES 为 128、192 或 256 位,以及精确长度的 IV(AES 为 128 位或 16 字节),否则会出现错误或添加一些未知的填充。

错误很明显:

收到大小为 38 的初始化向量,但此加密模式需要大小为 32

IV 的长度不正确。

当然存在提供的代码没有IV的问题。

错误消息还指出预期的 IV 长度为 32 个字节,这不是 AES。 Mose 很可能是带有 256 位密钥的 Rijndael。这是使用 mcrypt 时的常见错误,其中参数是块大小而不是密钥大小。密钥大小取决于传递的密钥的大小。

MCRYPT_RIJNDAEL_256 是具有 256 位块大小的 Rijndael,不是 AES,
MCRYPT_RIJNDAEL_128 是具有 128 位块大小的 Rijndael, AES

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-06
    • 2016-10-01
    • 2018-11-22
    • 1970-01-01
    • 2023-03-17
    • 2016-11-07
    • 2019-05-17
    相关资源
    最近更新 更多