如何使用之前使用 mcrypt 加密的 OpenSSL 解密字符串?
Posted
技术标签:
【中文标题】如何使用之前使用 mcrypt 加密的 OpenSSL 解密字符串?【英文标题】:How to decrypt a string with OpenSSL which was previously encrypted with mcrypt? 【发布时间】:2017-07-05 01:08:17 【问题描述】:由于 mcrypt 在 php 7.1 中已被弃用,并且我在现有项目中有大量使用 mcrypt 加密/解密的数据,如何将我的 PHP 代码从 mcrypt 迁移到 OpenSSL?我有以下代码要加密:
$encoded = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, 'salt', 'source string', MCRYPT_MODE_ECB));
而解密码是:
$source = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, 'salt', base64_decode('encoded string'), MCRYPT_MODE_ECB);
我应该在上面的示例中使用哪些openssl_
函数来获得相同的结果而无需编码数据转换?
或者唯一的方法是运行一个脚本,该脚本将使用 mcrypt 解密我存储的所有加密数据并使用 openssl 进行编码?
谢谢
【问题讨论】:
不要使用 ECB 模式,它不安全,请参阅ECB mode,向下滚动到企鹅。 PHP replace mcrypt with openssl? 【参考方案1】:OpenSSL 没有 Rijndael-256 密码;没有等价物 - 您必须解密并重新加密所有内容。
还有:
您缺少填充和身份验证。 不要使用 ECB 模式。 “salt”不是正确的加密密钥,也不是任何常规字符串。使用random_bytes() 生成您的密钥,具有适合所选算法的密钥长度。以上所有内容都可以这样总结:不要自己做,使用经过严格审查的库,例如defuse/php-encryption。
密码学不是一件简单的事情,你不能只用 5 行代码就可以正确地做到这一点。
【讨论】:
感谢您的回答。你能建议一个合适的 random_bytes() 长度吗?您能否建议一个类似于或优于 Rijndael-256 的 openssl 算法用于常规网站使用,例如密码加密?我的实际任务不是用户密码加密,而是类似的。 没有普遍适用的长度……这取决于算法。至于算法本身 - 只需使用一个库。以上是关于如何使用之前使用 mcrypt 加密的 OpenSSL 解密字符串?的主要内容,如果未能解决你的问题,请参考以下文章