PHP7.1 mcrypt 替代方案

Posted

技术标签:

【中文标题】PHP7.1 mcrypt 替代方案【英文标题】:PHP7.1 mcrypt alternative 【发布时间】:2017-06-04 01:57:48 【问题描述】:

php 7.1.0 起,Mcrypt 函数已被弃用。

我已弃用的​​字符串编码/解码函数:

$key: secret key
$str: string


$encoded = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $str, MCRYPT_MODE_CBC, md5(md5($key))));

$decoded = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($str), MCRYPT_MODE_CBC, md5(md5($key))), "\0");

你能推荐一些替代品吗?

【问题讨论】:

你在这里不走运。您正在使用 Rijndael-256 密码,这是非常不寻常的,并且不受 OpenSSL 支持。您可能的意思是 AES-256,它是带有 256 位密钥的 Rijndael-128。如果您可以选择切换密码,请切换到 Rijndael-128,在这种情况下您可以使用 OpenSSL。 为什么不直接使用 sha-256 (sha version 2) mcrypt is deprecated, what is the alternative?的可能重复 【参考方案1】:

您应该改用openssl_encrypt。

【讨论】:

加密示例:micmap.org/php-by-example/en/function/openssl_encrypt,解密示例:micmap.org/php-by-example/en/function/openssl_decrypt【参考方案2】:

考虑使用defuse 或RNCryptor,它们提供了完整的解决方案,正在维护并且是正确的。

【讨论】:

【参考方案3】:

如上所述,open_ssl 是 mcrypt 的一个很好的替代方案。 我对 open_ssl 的唯一问题是它不能用于大字符串。

我写了一个脚本(静态类),它克服了这个问题(大字符串被分割成块并在后台分别加密/解密)。

查看公共要点: https://gist.github.com/petermuller71/33616d55174d9725fc00a663d30194ba

【讨论】:

【参考方案4】:

对于MCRYPT_RIJNDAEL_256,我在此处发布了 PHP7.3 的完整答案:https://***.com/a/53937314/243782

sn-p:

像这样与phpseclib 库一起工作

$rijndael = new \phpseclib\Crypt\Rijndael(\phpseclib\Crypt\Rijndael::MODE_ECB);
$rijndael->setKey(ENCRYPT_KEY);
$rijndael->setKeyLength(256);
$rijndael->disablePadding();
$rijndael->setBlockLength(256);

$decoded = $rijndael->decrypt($term);

【讨论】:

【参考方案5】:
echo encrypt_openssl($str, $key);

function encrypt_openssl($msg, $key, $iv = null) 
        $iv_size = openssl_cipher_iv_length('AES-256-CBC');
        if (!$iv) 
            $iv = openssl_random_pseudo_bytes($iv_size);
        
        $encryptedMessage = openssl_encrypt($msg, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
        return base64_encode($iv . $encryptedMessage);
    

mcrypt 可能在 PHP 7.1 替代 openssl

中被移除

【讨论】:

以上是关于PHP7.1 mcrypt 替代方案的主要内容,如果未能解决你的问题,请参考以下文章

Rijndael 192 位块大小 mcrypt 替代方案

PHP 7.3 中的 mcrypt_create_iv 替代方案 [重复]

PHP 7.2 中 mcrypt_encrypt 的完全替代品

PHP 7.2中mcrypt_encrypt的精确替代

AES/CBC/PKCS5 填充 |替代 PHP OpenSSL 中的 mcrypt_get_block_size()

准备在 PHP 7.2 中移除 Mcrypt