2017-10-19 202 views
2

我想在我的服务器上创建一个UUID,由于某种原因openssl_enrypt正在初始化一个空字符串。如果它返回false,这将是一个不同的对话,但它不是,它返回一个字符串,只是一个空的字符串。openssl_encrypt返回空字符串

这里是我的所有代码,我使用的是建立我想要加密的字符串:

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

+1

这似乎是你使用'AES-256-XTS'的方法。例如,如果将其更改为“aes128”或“AES-128-CBC”,则会看到结果。请查阅文档http://php.net/manual/en/function.openssl-encrypt.php - 手册中没有列出“AES-256-XTS”。 –

+0

@ Fred-ii-你说的没错,谢谢!我无法相信我没有看到...我很乐意给你答案! –

+0

亚当,*欢呼* –

回答

3

@ Fred-ii-你绝对没错,谢谢!我无法相信我没有看到...我很乐意给你答案!

按照要求:

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

编辑:我从之前的编辑中删除了错误报告,我将进一步调查这个问题,为什么最终会产生一个空的结果。由于(密码)方法(实际上)在运行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大脑和测试方面也有一些帮助;两个头常常比一个好,所以Jay也值得赞扬。

注意:多个源指示它(“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

有关可用密码方法的列表,请使用[openssl_get_cipher_methods()](http://php.net/manual/en/function.openssl-get-cipher-methods.php)。 –

+1

原谅我的无知...... PHP(或PHP-OpenSSL)如何通过返回false或抛出异常不表示失败?这似乎有点让我失望。 – jww

+1

@jww这很奇怪。我使用'AES-256-XTA'替代了“C”,并使用OP的代码中的“A”对此进行了测试,并发出警告。但是,“C”没有。同样的事情只是使用“X”或“aaa”。这可能值得一个错误报告。 –