openssl_encrypt返回空字符串

时间:2017-10-19 01:05:33

标签: php hash cryptography sha512 php-openssl

我正在尝试在我的服务器上创建一个UUID,由于某种原因,this.from1正在初始化一个空字符串。如果它返回错误,这将是一个不同的对话,但它不是,它返回一个字符串,只是一个空的。

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

openssl_enrypt

我有$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,他们都返回了正确的值。

2 个答案:

答案 0 :(得分:4)

  

@ Fred-ii-你说得对,谢谢!我不敢相信我没有看到......我很乐意给你答案!

根据要求:

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

编辑:我从之前的编辑中删除了错误报告,我将进一步调查此问题,以便最终产生空结果。

由于(cipher)方法在运行var_dump(openssl_get_cipher_methods());时确实存在(实际上),它也可能依赖于openssl ;从错误报告中留下的评论中提取/取出。

<击> 如果/我希望得到结果/解释为什么OP和我自己的测试是空的并从OP获得更多信息,我将更新我的答案。

<强>编辑:

在做了更多研究后,我偶然发现了this link并且该代码使用“AES-256-XTS”密码方法“开箱即用”(注意;请参阅在附近的源脚本中注释了行注释。)

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

  • 消息被“哈希”作为密钥,而这又使字符串为空。只对主键而不是键和数据/消息进行散列,因为您尝试使用消息加密现有的散列方法并使用键“作为键”

生成的脚本如下:

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

$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和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";

答案 1 :(得分:0)

我遇到一个问题,即openssl_encrypt()在我的客户站点上始终返回一个空字符串,而在我的开发站点上却完美无缺。如果返回了FALSE,则openssl_error_string()可能会帮助我进行故障排除,但显然openssl_encrypt()并没有真正失败-只需返回空字符串即可。

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

phpversion()