【问题标题】:Encrypt decrypt issue with new php version使用新的 php 版本加密解密问题
【发布时间】:2018-04-11 11:11:55
【问题描述】:

我的一个网站上有一个加密功能,它在 PHP 5.3.29 上运行 该函数在此版本的 PHP 上正常工作。功能是:

function encrypt($text) { 
    return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, SALT, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)))); 
}

我有另一个在 PHP 5.6.29 上运行的网站。在此版本上,相同的函数不会返回任何内容。它返回空白。

同样,我有解密功能,它也不适用于 PHP 5.6.29

function decrypt($text) { 
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, SALT, base64_decode($text), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))); 
}

我需要让这个函数在 PHP 5.6.29 上工作,因为我的网站是通过 API 连接的。我不知道如何使它起作用。有什么帮助吗?

【问题讨论】:

  • 解构你的函数调用,看看哪个没有返回预期的结果。前任。试试 base64_decode, mcript_get_iv_size, ... 这样一旦你找到哪一个,你可以在文档中查找它,看看有什么变化。
  • mcrypt_decrypt 中使用的mcrypt_create_iv 不会创建一个新的 IV,而不是使用原始文本加密的那个吗?同样在加密字符串上运行trim 可能会删除重新创建它所需的数据。
  • @apokryfos 是的。但 ECB 模式不使用 IV;它们被忽略了,如果你提供它们没有区别。这也是欧洲央行不好的原因。
  • @Narf,很抱歉,但我想我无法解释自己。实际上我还没有将 SALT 值存储在数据库中。我的意思是说我已经使用上述功能将密码和其他重要的东西存储在数据库中。我有一个全局变量,它作为 SALT 的值,我在需要的地方使用该全局变量。您能否稍微解释一下您所说的 SALT 的“正确值”是什么意思?
  • @YunusAslam 此外,您展示的小代码中存在大量问题,但从您上次的评论来看,您似乎完全走错了路。用户密码必须是散列,而不是像你正在做的那样加密 - 再次,不同的事情。

标签: php encryption php-5.3 mcrypt php-5.6


【解决方案1】:

我认为您对 SALT 有疑问。如果您将提供 32 个字符的 SALT,那么这些函数也会在 PHP 5.6.29 中提供输出。

【讨论】:

    【解决方案2】:

    您可能传递了不正确的 SALT 值。来自手册:

    不再接受无效的密钥和 iv 大小。如果输入无效,mcrypt_encrypt() 现在将抛出警告并返回 FALSE。以前键和 IV 用 '\0' 字节填充到下一个有效大小。

    这是对 PHP 5.6 的更改,与您所看到的一致。

    请注意,加密密钥与散列盐不同,散列盐通常可以是任意长度。

    【讨论】:

    • @ianin 我的盐值是正确的。我已经使用上述加密函数将值存储在数据库中,现在我无法在较新的 php 版本上执行此操作。我需要这样做。你知道如何让它发挥作用吗?
    • 根据定义,只要您称其为“盐”,您就无法知道您拥有“正确值”。因为它不是盐。
    猜你喜欢
    • 2011-08-29
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    相关资源
    最近更新 更多