【问题标题】:PHP cryption on server won't work "mcrypt_get_iv_size" function服务器上的 PHP 加密不起作用“mcrypt_get_iv_size”功能
【发布时间】:2016-09-11 13:50:11
【问题描述】:

所以我正在编写一个 Web 应用程序,对于某些用途,我需要加密字符串并稍后解密,我的代码中的所有内容都可以在 El Capitan 10.11.4 和 XAMPP 5.6.15-1 上的 Macbook 上的 localhost 上完美运行,但是当我在服务器上上传代码它只是不起作用。我发现了一个问题(我也在多台服务器上尝试过)。

这是我的代码:

<?php
session_start();
header("Content-Type: text/html;charset=UTF-8");
if (isset($_POST["file"])) {
    $filename = $_POST["file"];
    //$filename = $_GET["file"];
    $filename = substr($filename, 12);

    $username = $_SESSION["username"];
    $key = $_SESSION["key"];

    $filename = "../users/$username/text/" . $filename;

    $fileNumber = $_POST["number"];

    ///Cloude/users/antonio/text/teext/file2.txt
    // Cloude/script

    $handle = fopen($filename, "r");
    $contents = fread($handle, filesize($filename));
    fclose($handle);
echo $contents;
    $decrypt = str_replace(" ", "+", $contents);

echo " ------ 1 ------ ";

    $decrypt = explode('|', $decrypt.'|');
    $decoded = base64_decode($decrypt[0]);
    $iv = base64_decode($decrypt[1]);

echo " ------ 2 ------";

    if(strlen($iv)!==mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC)){ return false; }

echo " ------ 3 ------";

    $key = pack('H*', $key);
    $decrypted = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $decoded, MCRYPT_MODE_CBC, $iv));
    $mac = substr($decrypted, -64);
    $decrypted = substr($decrypted, 0, -64);
    $calcmac = hash_hmac('sha256', $decrypted, substr(bin2hex($key), -32));
    if($calcmac!==$mac){ return false; }
    $decrypted = unserialize($decrypted);

    echo json_encode($decrypted . "qJB0rGtIn5UB1xG03efyCp55");
}

而且,此回声仅用于测试哪条线路不起作用。所以当我尝试运行它时,它只会打印“------ 1 ------ and ------ 2 ------”,之后的代码

mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC)

只是不能在服务器上工作,有谁知道为什么?

编辑:我发现了错误,这是托管问题,他们做了一些奇怪的事情,无论如何谢谢!

【问题讨论】:

  • 错误检查说什么?
  • 谢谢,但我想我发现了错误,问题是我在 000webhost.com 使用免费托管,当他们识别 .html 文件添加跟踪分析的脚本时,我只需要删除该脚本读取文件时的代码,一切都很好,谢谢
  • 很高兴知道它已解决。
  • 顺便说一句,我希望你不打算为这项服务付费;这简直太糟糕了。那里有更好的免费托管服务。几年前我用过那个,但它们仍然很糟糕,如果不是更糟的话。 sigh 从经验中汲取经验 ;-) 当我看到一个糟糕的托管服务时,我知道它。
  • 理想情况下,为一个好的主机付费会改变世界,而 HostGator 是一个很好的选择。对于免费主机,我使用 AwardSpace 取得了不错的效果。旁注:我与他们没有任何关系(作为免责声明)。

标签: php encryption mcrypt rijndael cbc-mac


【解决方案1】:

您不应再使用 MCrypt 函数。为什么?因为MCrypt 被认为是废弃软件。该库不再积极维护,a long list of known bugs 很长一段时间都没有修复。

那么,解决您的问题的方法是什么? 快速、简单和最安全的选择是使用drop in library

以简单的方式进行强加密的示例:

// Assuming a PSR-4 compatible autoloader

use Driftwood\SymmetricEncryption;
$password = 'correct horse battery staple';

$crypto = new SymmetricEncryption(20);

$encrypted = $crypto->encrypt('Never roll your own crypto.', $password);
$decrypted = $crypto->decrypt($encrypted, $password);

echo $decrypted; // Never roll your own crypto.



如果你真的想创建自己的加密库(你不应该),那么推荐的解决方案是使用 PHP 的OpenSSL extension。 但是:加密很难,特别难。一个好的加密包装器需要多个密码学家和 PHP 专家一起工作,相互检查并仔细检查代码中的每个更改。审查每一个决定。

【讨论】:

  • 我在 Pixelfck/SymmetricEncryption 中看到的问题是缺少文档。它支持哪些加密原语(仅加密?),是否提供加密认证(似乎),数据格式是什么(阅读代码),所有这些都是互操作性所必需的。作为所需的示例,RNCryptor 提供了data format specification
  • @zaph,是的,我认为您应该打开一个问题以要求增加文档。他们很清楚这是经过身份验证的加密(Encrypt-then-mac),尽管 [第三个要点];否则我永远不会推荐它。我和一位(app-sec)同事(尽管我们不是密码学家)分析了代码,我们发现代码有据可查且质量很高。但是代码 cmets 当然不能替代适当的文档。
  • 或者:defuse/php-encryption 有据可查,昨天刚刚发布了第 2 版。
猜你喜欢
  • 2012-01-10
  • 2014-03-16
  • 2016-12-07
  • 2020-01-16
  • 2023-02-14
  • 1970-01-01
  • 1970-01-01
  • 2014-09-18
  • 1970-01-01
相关资源
最近更新 更多