首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP 7.2中删除Mcrypt的准备工作

PHP 7.2中删除Mcrypt的准备工作
EN

Stack Overflow用户
提问于 2017-03-09 13:27:20
回答 1查看 8.3K关注 0票数 8

因此,随着时间的推移,mcrypt将在PHP7.2中运行。当然,还有一种选择: openssl。

我发现很难从mcrypt切换到openssl,使用AES 256 CBC并保留IVs。我对密码学有点陌生,所以我并不是什么都知道,但我了解基本知识。

假设我有以下代码

代码语言:javascript
复制
function encrypt($masterPassword, $data) 
{
    $keySize = mcrypt_get_key_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
    $ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
    $iv = mcrypt_create_iv($ivSize, MCRYPT_DEV_URANDOM);
    $key = mb_substr(hash('SHA256', $masterPassword), 0, $keySize);
    $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_MODE_CBC, $iv);
    return base64_encode($iv . $encrypted);
}

function decrypt($masterPassword, $base64) 
{
    $keySize = mcrypt_get_key_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
    $ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
    $key = mb_substr(hash('SHA256', $masterPassword), 0, $keySize);
    $data = base64_decode($base64);
    $iv = substr($data, 0, $ivSize);
    $encrypted = substr($data, $ivSize, strlen($data));
    $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $encrypted, MCRYPT_MODE_CBC, $iv);
    return trim($decrypted);
}

如何将此代码“转换”为使用mcrypt中的openssl?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-09 13:37:05

您不能转换它,因为Rijndael-256不是AES-256,而且OpenSSL扩展也不支持Rijndael-256。

AES-256是具有256位(32字节)密钥的Rijndael-128 .

不幸的是,你必须重新加密你所有的数据。

编辑:另外,您目前使用的方案存在一些问题:

  • 它缺乏身份验证(在PHP中HMACs是最简单的方法)
  • 它缺少适当的填充(mcrypt具有零字节;您需要类似PKCS#5填充的内容),这是块模式加密安全所必需的。
  • 它不是字节安全的(您使用的是mb_substr())

好消息是OpenSSL会自动为您做PKCS#5填充,但是您应该更进一步,使用像defuse/php-加密这样的可靠加密库。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42696657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档