PHP 服务器上的加密不起作用 "mcrypt_get_iv_size" 功能
PHP cryption on server won't work "mcrypt_get_iv_size" function
所以我正在编写一个 Web 应用程序,对于某些用途,我需要加密字符串并稍后解密,我的代码中的所有内容都可以在 El Capitan 10.11.4 和 XAMPP 5.6 的 Macbook 上的本地主机上完美运行.15-1 但是当我在服务器上上传代码时它就无法工作。我发现了一个问题(我也在多台服务器上试过)。
所以这是我的代码:
<?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)
只是无法在服务器上运行,有人知道为什么吗?
编辑:我发现了这个错误,这是托管问题,他们做了一些奇怪的事情,无论如何谢谢!
您不应再使用 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 专家一起工作,互相检查并仔细检查代码中的每个更改。仔细审查每一个决定。
所以我正在编写一个 Web 应用程序,对于某些用途,我需要加密字符串并稍后解密,我的代码中的所有内容都可以在 El Capitan 10.11.4 和 XAMPP 5.6 的 Macbook 上的本地主机上完美运行.15-1 但是当我在服务器上上传代码时它就无法工作。我发现了一个问题(我也在多台服务器上试过)。
所以这是我的代码:
<?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)
只是无法在服务器上运行,有人知道为什么吗?
编辑:我发现了这个错误,这是托管问题,他们做了一些奇怪的事情,无论如何谢谢!
您不应再使用 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 专家一起工作,互相检查并仔细检查代码中的每个更改。仔细审查每一个决定。