当前位置: 首页 > 面试题库 >

准备在PHP 7.2中删除Mcrypt

林念
2023-03-14
问题内容

因此,随着时间的推移,mcrypt将在PHP 7.2中使用。当然,还有一种选择:openssl。

我发现很难使用AES 256 CBC和保留IV从mcrypt切换到openssl。我对密码学有点陌生,所以我并不是真的一无所知,但我了解一些基础知识。

假设我有以下代码

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?


问题答案:

您无法进行转换,因为Rijndael-256不是AES-256,并且OpenSSL扩展不附带Rijndael-256支持。
AES-256是具有256位(32字节)密钥的Rijndael-128。

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

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

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

好消息是,OpenSSL将自动为您执行PKCS#5填充,但是您应该走得更远,并使用像defuse/php-encryption这样的可靠加密库。



 类似资料:
  • 所以随着时间的推移,mcrypt将在PHP 7.2中使用。当然还有一个替代方案:openssl。 我发现很难从 mcrypt 切换到开放,使用 AES 256 CBC 并保留 IV。我对密码学有点陌生,所以我并不真正了解一切,但我了解基础知识。 假设我有下面的代码 如何“转换”此代码以使用开放sl而不是mcrypt?

  • 我的应用程序有很多使用语句编写的JDBC查询,因此容易受到SQL注入的影响。不幸的是,这个应用程序是大约10年前开发的,可能开发人员不知道准备语句。 我知道解决这个问题的最好方法是使用PreparedStatement,但是在整个应用程序中转换它是非常繁琐的。此外,为SQL注入编写任何类型的模式匹配可能非常棘手,因为像Select、insert、union等关键字都是英语单词,它们也可能出现在用户

  • 本书大部分篇幅会用来关注MongoDB的核心功能。所以我们基本上使用的是MongoDB的外壳(shell)。shell在学习MongoDB还有管理数据库的时候很有用,不过您的实际代码还是会用相应的语言来驱动mongoDB的。 这也引出了关于MongoDB您首先需要了解的东西:它的驱动。MongoDB有许多针对不同语言的官方驱动。可以认为这些驱动和您所熟知的各种数据库驱动是一样的。基于这些驱动,Mo

  • 先去准备,下载,安装几个东西。 命令行 使用 Vagrant,几乎都是在命令行下进行的,所以你需要先准备一个命令行界面。Windows 用户我推荐使用完整版的 cmder,macOS 用户可以使用系统自带的终端(Terminal)。 Windows 下载 cmder: https://github.com/cmderdev/cmder 虚拟机 选择一款虚拟机软件,Virtualbox,VMWare

  • 学习 CentOS,你需要一台安装了这种操作系统的机器,可以是一台真正的服务器,也可以是在本地电脑上创建的一台 CentOS 的虚拟机。Vagrant 入门教程 这本书里介绍了在本地管理虚拟机的方法。 虚拟机 创建一台 CentOS 系统的虚拟机。打开命令行,执行: cd ~/desktop mkdir wenjiangs-centos cd wenjiangs-centos vagrant

  • 问题内容: 我正面临错误消息: 这是导致错误的代码 在Obj-C上可以这样使用: 我究竟做错了什么? 问题答案: 这似乎是由于子类模板中的问题。它带有该方法的一种版本,需要您解开序列。 将当前功能替换为: 这个版本隐式地解开了参数,所以应该没问题。