PHP7.1的替代mcrypt方案

16

自 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");

你能提出一些替代方案吗?


1
你在这里运气不佳。你正在使用Rijndael-256密码,这是非常不寻常的,也不受OpenSSL支持。你可能想要使用的是AES-256,它是带有256位密钥的Rijndael-128。如果切换密码对你来说是一个选项,那么请切换到Rijndael-128,这样你就可以使用OpenSSL了。 - NikiC
为什么不直接使用SHA-256(SHA版本2)呢? - TheCrazyProfessor
可能是mcrypt已被弃用,有什么替代品?的重复问题。 - kenorb
5个回答

18

1
加密示例:http://micmap.org/php-by-example/zh/function/openssl_encrypt,解密示例:http://micmap.org/php-by-example/zh/function/openssl_decrypt - Milad Ghiravani

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

1

对于MCRYPT_RIJNDAEL_256,我在此处为PHP7.3发布了完整的答案:https://dev59.com/HFgR5IYBdhLWcg3wftSq#53937314

片段:

使用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);

1
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 代替。


-2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接