Ada*_*urk 5 php hash cryptography sha512 php-openssl
我正在尝试在我的服务器上创建一个 UUID,并且由于某种原因openssl_enrypt
正在初始化一个空字符串。如果它返回 false,这将是一个不同的对话,但事实并非如此,它返回一个字符串,只是一个空字符串。
这是我用来构建我想要的加密字符串的所有代码:
$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);
Run Code Online (Sandbox Code Playgroud)
我有var_dumped
$key
、$iv
、$dataEncrypt
和 它们都返回正确的值。
@Fred-ii-你说得完全正确,谢谢!我不敢相信我没有看到......我很乐意给你答案!
按照要求:
这似乎是你正在使用的方法AES-256-XTS
。例如,如果将其更改为aes128
或,您将看到结果。AES-128-CBC
请参阅文档http://php.net/manual/en/function.openssl-encrypt.phpAES-256-XTS
-手册中没有列出。
编辑:我从之前的编辑中删除了错误报告,我将进一步调查为什么这最终会产生空结果。
由于(密码)方法在运行 a 时确实(事实上)存在var_dump(openssl_get_cipher_methods());
,因此它也可能依赖于 openssl;从错误报告中留下的评论中提取/获取。
如果/一旦我希望得到结果/解释为什么OP和我自己的测试结果为空,并从OP获取更多信息,我将更新我的答案。
编辑:
经过更多研究后,我偶然发现了这个链接,并且该代码使用“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";
Run Code Online (Sandbox Code Playgroud)
特别提示:我在挑选Jay Blanchard 的大脑并进行测试方面也得到了一些帮助;两个头脑往往比一个头脑好,所以杰伊也值得赞扬这一点。
注意:多个来源表明它(“AES-256-XTS”)用于文件系统/磁盘加密。您可以说“AES-256-XTS 和 AES-128-XTS”方法实际上用于文件系统加密,因此不适合文本。
从此链接获取源代码:
<?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";
Run Code Online (Sandbox Code Playgroud)