我正在用 PHP 加密密码,并想在不同的盒子上解密它。我没有运气,我希望能够直接从 bash 解密它并回显它。下面是 PHP 测试的一个片段。
$textToEncrypt = "My super secret information.";
$encryptionMethod = "AES-256-CBC";
$secretHash = "Testkey";
//To encrypt
$encryptedMessage = openssl_encrypt($textToEncrypt, $encryptionMethod, $secretHash);
//To Decrypt
$decryptedMessage = openssl_decrypt($encryptedMessage, $encryptionMethod, $secretHash);
//Result
echo "Encrypted: $encryptedMessage <br>Decrypted: $decryptedMessage";
我尝试了多种方法在 Ubuntu 上对其进行解密,甚至将数据存储到文件中并将其输出到文件中。尝试的命令是:
openssl aes-256-cbc -a -d -k Testkey -in foo.txt -out secrets.txt
其中
foo.txt
是 PHP 加密返回的值,secrets.txt
是输出。我怎样才能做到这一点? 最佳答案
正如评论中一样,值得重申的是,没有 IV 的加密是危险的。事实上,当前版本的 PHP 会对此发出警告。可以使用 openssl_random_pseudo_bytes()
函数随机生成 IV,并与加密文本一起以明文形式传输。它们不必是 secret 的,重要的是不要重复使用相同的 key 和 IV 组合,并且具有随机的 IV。
因此,顺便说一下,如果您查看 the source for the function ,它不会将 password
参数作为密码传递,而是作为 key 传递。所以为了在命令行上使用 openssl
,它需要是十六进制的并传递给 -K
选项,而不是 -k
选项。但是,您会收到一条错误消息,提示“iv undefined”,因此您的 PHP 需要进行调整以包含一个:
<?php
$textToEncrypt = "My super secret information.\n";
$encryptionMethod = "AES-256-CBC";
$key = "Testkey";
$iv = openssl_random_pseudo_bytes(
openssl_cipher_iv_length($encryptionMethod)
);
$keyHex = bin2hex($key);
$ivHex = bin2hex($iv);
//To encrypt
$encryptedMessage = openssl_encrypt($textToEncrypt, $encryptionMethod, $key, 0, $iv);
//To Decrypt
$decryptedMessage = openssl_decrypt($encryptedMessage, $encryptionMethod, $key, 0, $iv);
//Result
printf(
"Decrypted message: %s\n\nkeyHex=%s\nivHex=%s\nencryptedMessage=%s\n",
$decryptedMessage,
escapeshellarg($keyHex),
escapeshellarg($ivHex),
escapeshellarg($encryptedMessage)
);
获得这些详细信息后,您可以从命令行解密(在此处重新使用 PHP 变量名称):
echo -n "$encryptedMessage" | openssl aes-256-cbc -d -a -A -K "$keyHex" -iv "$ivHex"
关于php - 如何使用 BASH 命令解密 PHP Openssl 加密,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34835336/