我使用 Laravel 5.7,并且有两个应用程序在不同的服务器上运行。我想通过加密进行通信。所以两端都需要有一定的 key 。默认 Laravel 加密设置为 AES-256-CBC。
所以我想,我需要一个像这样的 32 字节 key :
$key = bin2hex(openssl_random_pseudo_bytes(32, $cstrong));
我得到一个 64 长的十六进制字符串,我想在两端保存它,这样双方都可以一侧加密,另一侧解密。
但不知何故,这个 key 不被接受。 Laravel 抛出: 唯一支持的密码是具有正确 key 长度的 AES-128-CBC 和 AES-256-CBC
我还尝试将其设置为 16 字节,使用 32 个字符的 key 。也不起作用。
但是,将其设置为 8 位、使用 16 个字符的 key 时,它确实可以工作。但这对我来说没有任何意义?
Laravel 本身使用类似这样的键: base64:X,其中 X=44 个字符串。
我在某处读到,AES-256-CBC 需要 64 个字符的 key ,其中 44 个字符应该是 base64。我不确定这是否正确,但我很难得到这个。如何读取带有 Base64: 前缀的 key ?如何将其恢复为常规字符串。
现在我已经解决了这个 16 个字符的字符串,但似乎不对。那么如何生成有效的 AES-256-CBC key 以及如何存储它呢?如果需要base64,它是如何工作的?对 64 生成的十六进制 key 进行编码可以返回 88 个字符的字符串。
感谢任何帮助。
最佳答案
我无法亲自尝试,但请查看源代码 here :
/**
* Create a new encryption key for the given cipher.
*
* @param string $cipher
* @return string
*/
public static function generateKey($cipher)
{
return random_bytes($cipher === 'AES-128-CBC' ? 16 : 32);
}
因此,您只需调用 random_bytes()
(或其 openssl 等效项)即可,要么请求 16 个字节(在 AES-128-CBC 的情况下),要么请求 32 个字节(在 AES-128-CBC 的情况下) AES-256-CBC)。这是有道理的,因为最终 AES 的 key 只不过是一堆随机字节。
可能会让您感到困惑的是术语字符串
的用法。与 string
类型的常见用法不同,在这种情况下,它不是一个可打印字符串,而只是一个字节集合,其中有 16 个或 32 个字节。
这就是 Base64
translation 的原因它允许您仅使用 ASCII 字符来表示字节集合。我怀疑您所指的“base64:X,其中 X=44 字符串”值是在某些配置文件中找到的,该文件通常应仅包含可读字符。事实上,将 32 字节转换为 Base64 格式将产生 44 个字符。在这种情况下,base64:
前缀仅用于指示该值以 Base64 格式存储。
一个说明这一切的例子:
$key = random_bytes(32);
var_dump($key);
var_dump(base64_encode($key));
给出
string(32) "?9???֔e?N??Y?&[??b?4@O|?\?"
string(44) "45U5nvetGyfWlGWOF06N+VnIJlvwx2L3fzRAT3z5XPY="
后者是存储 key 的便捷格式。
PS:Encryption - Configuration section of the docuemntation提及
Before using Laravel's encrypter, you must set a key option in your config/app.php configuration file. You should use the php artisan key:generate command to generate this key
也许该命令可以完成您自己尝试做的所有事情?
关于php - 生成正确的 AES-256-CBC key /如何存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54329479/