openssl_encrypt 返回空字符串

openssl_encrypt returning empty string

我正在尝试在我的服务器上创建一个 UUID,但出于某种原因 openssl_enrypt 正在初始化一个空字符串。如果它 return 是假的,这将是一个不同的对话,但它不是,它是 return 一个字符串,只是一个空字符串。

这是我用来构建我想要的加密字符串的所有代码:

$key = hash_hmac("sha512", "You can decrypt this all day long, won't get you closer to the truth", "myKey");
$iv = openssl_random_pseudo_bytes(16);
$adminVal = filter_var($userData['is_admin'], FILTER_VALIDATE_BOOLEAN);
$userName = $userData["name"];
$dataEncrypt = $adminVal.$userName;
$encrypted = openssl_encrypt($dataEncrypt, "AES-256-XTS", $key, 0, $iv);

我有 var_dumped $key$iv$dataEncrypt,它们都 return 正确值。

@Fred-ii- You're absolutely right, thank you! I can't believe I didn't see that...I would love to give you the answer!

根据要求:

这似乎是您正在使用的方法AES-256-XTS。例如,如果将其更改为 aes128AES-128-CBC,您将看到一个结果。查阅文档 http://php.net/manual/en/function.openssl-encrypt.php - 手册中没有列出 AES-256-XTS

编辑:我从之前的编辑中删除了错误报告,我将进一步调查为什么最终会产生空结果。

由于运行 a var_dump(openssl_get_cipher_methods());时(cipher)方法确实(事实上)存在,可能还依赖于openssl;作为 pulled/taken 来自错误报告中留下的评论。

我将更新我的答案 if/once 我希望能得到 results/an 解释为什么 OP 和我自己的测试结果为空,并从 OP 获得更多信息。


已编辑:

经过更多研究后,我偶然发现了 this link 并且该代码使用 "AES-256-XTS" 密码方法工作 "right out of the box"(注意;请参阅源脚本末尾的注释行注释)。

在查看该代码并将其与 OP 进行比较时,我注意到需要加密的是 data/message。

  • 邮件经过哈希处理 "as the key",这又使字符串为空。仅散列密钥而不散列密钥和 data/message,因为您试图使用消息和密钥 "as the key".[=61 加密现有的散列方法=]

生成的脚本如下:

旁注:下面的注释行也适用于它们各自的部分;只是不要同时使用两者。

$plaintext = 'The secret message in plain text';
$password = '3sc3RLrpd17';
$key = substr(hash('sha256', $password, true), 0, 32);

$iv = openssl_random_pseudo_bytes(16);
$method = "aes-256-xts";
$userName = "JOHN";
$encrypted = base64_encode(openssl_encrypt($plaintext, $method, $key, OPENSSL_RAW_DATA, $iv));
// $encrypted = openssl_encrypt($plaintext, $method, $key, OPENSSL_RAW_DATA, $iv);

    echo "<br>";
    var_dump($iv);
    echo "<br>";
    var_dump($userName);
    echo "<br>";
    var_dump($encrypted);
    echo "<hr>";

$decrypted = openssl_decrypt(base64_decode($encrypted), $method, $key, OPENSSL_RAW_DATA, $iv);
// $decrypted = openssl_decrypt($encrypted, $method, $key, OPENSSL_RAW_DATA, $iv);
    echo 'decrypted to: ' . $decrypted . "\n\n";

特别说明:我在挑选Jay Blanchard's大脑和测试方面也得到了一些帮助;两个脑袋往往比一个脑袋好,所以周杰伦也值得赞扬。

注意:不止一个来源表明它("AES-256-XTS")用于文件系统/磁盘加密。您可以说 "AES-256-XTS and AES-128-XTS" 方法真正用于文件系统加密,因此不适用于文本。

源代码来自 this link:

<?php

$plaintext = 'My secret message 1234';
$password = '3sc3RLrpd17';
$method = 'aes-256-cbc'; // I replaced aes-256-cbc with aes-256-xts during testing

// Must be exact 32 chars (256 bit)
$password = substr(hash('sha256', $password, true), 0, 32);
echo "Password:" . $password . "\n";

// IV must be exact 16 chars (128 bit)
$iv = chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0);

// av3DYGLkwBsErphcyYp+imUW4QKs19hUnFyyYcXwURU=
$encrypted = base64_encode(openssl_encrypt($plaintext, $method, $password, OPENSSL_RAW_DATA, $iv));

// My secret message 1234
$decrypted = openssl_decrypt(base64_decode($encrypted), $method, $password, OPENSSL_RAW_DATA, $iv);

echo 'plaintext=' . $plaintext . "\n";
echo 'cipher=' . $method . "\n";
echo 'encrypted to: ' . $encrypted . "\n";
echo 'decrypted to: ' . $decrypted . "\n\n";

我遇到了一个问题,即 openssl_encrypt() 在我的客户站点上不断返回一个空字符串,而它在我的开发站点上运行完美。如果它返回 FALSE,那么 openssl_error_string() 可能会帮助我排除故障,但显然 openssl_encrypt() 实际上并没有失败 - 只是返回空字符串。

长话短说,问题原来是我的开发服务器是 运行 PHP 7.1,而我的客户端服务器是 运行 5.6。我的解决方法是从 openssl_encrypt() 中删除 $tag 参数(它在 PHP 7.1+ 中是可选的,但我一直在遵循 php.net 手册的示例)。

phpversion()