php - 生成正确的 AES-256-CBC key /如何存储?

标签 php encryption openssl key aes

我使用 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/

相关文章:

java - 用 C# 解密用 Java 加密的密码

Ruby/openssl:将椭圆曲线点八位字节字符串转换为 OpenSSL::PKey::EC::Point

java - 如何在grails中搜索加密数据

php - 按 2 列的平均值过滤的 Eloquent 方式

javascript - 使用普通的 javascript/jquery 在数组中创建对象

php - Prestashop 在使用 jquery 多 css 方法时显示白页

java - 安全性:将 javax.mail.Message 加密写入文件

c - 使用 Visual Studio 和 Openssl 进行 AES 256 CTR 加密/解密

c++ - 缺少 OpenSSL libcrypto-1_1-x64.dll

php - 无法插入数据 php mysql - 整数