为了账号安全,请及时绑定邮箱和手机立即绑定

PHP 7.2中移除Mcrypt的准备工作

PHP 7.2中移除Mcrypt的准备工作

PHP
慕桂英4014372 2019-07-16 10:30:21
PHP 7.2中移除Mcrypt的准备工作因此,随着时间的推移,mcrypt将在PHP7.2中运行。当然,还有一种选择:OpenSSL。我发现很难从mcrypt切换到OpenSSL,使用AES 256 CBC并保留IVs。我对密码学有点陌生,所以我并不是什么都知道,但我了解基本知识。假设我有以下代码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?
查看完整描述

1 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

您不能转换它,因为Rijndael-256不是AES-256,而且OpenSSL扩展不支持Rijndael-256。
AES-256是具有256位(32字节)密钥的Rijndael-128.

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

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

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

    mb_substr())

好消息是OpenSSL将自动为您执行pkcs#5填充,但是您应该更进一步,使用一个可靠的加密库,如Defuse/php-加密.


查看完整回答
反对 回复 2019-07-16
  • 1 回答
  • 0 关注
  • 316 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信