【问题标题】:mcrypt seem to be not 100% reversiblemcrypt 似乎不是 100% 可逆的
【发布时间】:2013-12-15 21:06:17
【问题描述】:

我的数据库中有 336 个“客户”

我将这段代码尝试到encrypt 然后decrypt 一些数据

esit 是:正确:323 - 错误:13

mcrypt 不完全可逆的原因是什么?

编辑:请不要试图改变问题的性质,问我的问题,否则我会否决你的答案。这个算法的问题似乎不是 100% 可逆的,这就是问题所在,问题不是我使用它的原因

        $wrong = $right = 0;

        foreach ($clients as $c) {
            $string_to_encode = trim($c->first_field . ":::" . $c->last_field);

            $mc_key = Yii::app()->params["rijndael_key"];
            $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
            $iv_1 = mcrypt_create_iv($iv_size, MCRYPT_RAND);
            $crypt = trim(mcrypt_encrypt(
                MCRYPT_RIJNDAEL_256,
                $mc_key,
                $string_to_encode,
                MCRYPT_MODE_ECB,
                $iv_1));
            $token = urlencode(base64_encode($crypt));

            $string_to_decode = base64_decode(urldecode($token));
            $string_decoded = trim(mcrypt_decrypt(
                MCRYPT_RIJNDAEL_256,
                $mc_key,
                $string_to_decode,
                MCRYPT_MODE_ECB,
                $iv_1));


            if ($string_to_encode != $string_decoded) {
                echo $string_to_encode . PHP_EOL;
                echo "***** ERROR ! ***** " . PHP_EOL;
                echo $string_to_encode . PHP_EOL;
                echo $string_decoded . PHP_EOL;
                $wrong ++;
            } else {
                $right ++;
            }

        }

        echo "Right $right - Wrong $wrong" . PHP_EOL;

与普通字符串和解码字符串的区别示例[请注意我更改了登录名....]

customer.email@alice.it:::11734
customer.email@alice.it:::11z͉\wo����y�+�   �>�d��x�

算法不是 100% 可逆的。这就是问题,这就是问题......显然我不会在生产中使用它......这只是向你演示这个算法有问题的一个案例

【问题讨论】:

  • 加密算法要么可逆,要么不可逆。它不会随意决定只有某些数据是不可逆的。
  • 是的,我知道......但是这段代码 100% 的时候得到了“一些”没有正确描述的字符串。有什么想法吗?
  • 无论如何,您都不应该对密码使用可逆算法。始终对密码使用不可逆的哈希算法。
  • 也许trim() 是您的问题的原因?我不会认为修剪加密函数的输出是明智的。
  • 是否有可能使用的函数之一失败并返回false,导致以后出现问题? crypt_create_ivmcrypt_get_iv_size 都可以在失败时返回 false。

标签: php encryption mcrypt


【解决方案1】:

hash them,而不是加密您的密码。

优点:

  • PHP(5.5+) 具有用于密码散列和验证的本机 API。
  • 散列总是不可逆的。如果您的数据库被盗,攻击者永远无法直接获取纯文本密码。
  • 正确的散列+加盐可解决 99% 的密码攻击向量。

【讨论】:

  • 我需要了解这个问题,而不是解决方法或不同的解决方案,但无论如何感谢。
  • @realtebo:请到PHP室进一步解释。 chat.stackoverflow.com/rooms/11/php。我希望我能改变你的想法。
  • 你真的不关心 crypt/decrypt 不是 1005 reversibile 吗?这对我来说是个大问题......
  • @realtebo:加密散列之间的区别在于一个是可逆的,另一个不是。我再说一遍你不希望你的密码哈希是可逆的!!。当您需要比较时,只需通过哈希运行用户密码并比较结果字符串。 永远不要以可逆格式保存密码,更不用说纯文本了。我再问你一次,请到PHP聊天室了解更多信息。
  • 我知道了,请忘记这是一个密码...关注我的问题,因为我正在加密一些其他数据!!!!我知道 waht 的散列...这只是一个演示,向您展示有关 MCRYPT 的问题!
【解决方案2】:

已经解决了您不应使用双向加密算法来保存密码,而应使用单向哈希算法。

您正在修剪数据密文。删除 mcrypt_encrypt() 周围的 trim() 就可以了。

也就是说,您还有另一个问题。您生成 IV,但 ECB 模式不使用 IV,因此这些是无用的。使您的密文更加不可预测的一种更安全的方法是切换到 CBC 模式。执行此操作时,请记住,加密和解密时 IV 应该相同(即 $iv_1$iv_2 应该相同)。

【讨论】:

  • 这不是真的。但我尝试使用 $iv_2 = $iv_1 结果是 IDENTICAL 。谢谢,你是第一个回复我的人!
  • 嗯,还有其他问题。但是 IV 绝对应该是相同的,所以这是您的问题之一。
  • 好的,我改了代码,所以我用的是同一个iv,但问题仍然在这里
  • @kba 这是我的第一个想法,但 ECB 模式不使用 IV,因此它们不必相同。此处提及:us1.php.net/manual/en/function.mcrypt-encrypt.php
  • 我明白了。在这种情况下,trim() 肯定是问题所在。
【解决方案3】:

其他人已经提到它,但您正在修剪加密的结果。密文将随机出现,并且您正在加密的某些项目最后会产生空格。

如果您修剪密文,您将丢失信息并且字符串将无法正确解码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 2013-07-12
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    相关资源
    最近更新 更多