【问题标题】:How to decrypt a string with OpenSSL which was previously encrypted with mcrypt?如何使用之前使用 mcrypt 加密的 OpenSSL 解密字符串?
【发布时间】: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 进行编码?

谢谢

【问题讨论】:

标签: php mcrypt php-openssl


【解决方案1】:

OpenSSL 没有 Rijndael-256 密码;没有等价物 - 您必须解密并重新加密所有内容。

还有:

  • 您缺少填充和身份验证。
  • 不要使用 ECB 模式。
  • “salt”不是正确的加密密钥,也不是任何常规字符串。使用random_bytes() 生成您的密钥,具有适合所选算法的密钥长度

以上所有内容都可以这样总结:不要自己做,使用经过严格审查的库,例如defuse/php-encryption

密码学不是一件简单的事情,你不能只用 5 行代码就可以正确地做到这一点。

【讨论】:

  • 感谢您的回答。你能建议一个合适的 random_bytes() 长度吗?您能否建议一个类似于或优于 Rijndael-256 的 openssl 算法用于常规网站使用,例如密码加密?我的实际任务不是用户密码加密,而是类似的。
  • 没有普遍适用的长度……这取决于算法。至于算法本身 - 只需使用一个库。
猜你喜欢
  • 1970-01-01
  • 2015-10-09
  • 1970-01-01
  • 2019-04-13
  • 2022-11-25
  • 2015-09-04
  • 2010-11-12
  • 2014-02-24
相关资源
最近更新 更多