Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 生成正确的AES-256-CBC密钥/如何存储?_Php_Encryption_Openssl_Key_Aes - Fatal编程技术网

Php 生成正确的AES-256-CBC密钥/如何存储?

Php 生成正确的AES-256-CBC密钥/如何存储?,php,encryption,openssl,key,aes,Php,Encryption,Openssl,Key,Aes,我使用Laravel5.7,有两个应用程序在不同的服务器上运行。我想与加密通信。所以两端都需要有一个特定的键。默认laravel加密设置为AES-256-CBC 所以我想,我需要这样一个32字节的密钥: $key=bin2hex(openssl_随机_伪_字节(32,$cstrong)) 我得到了一个64长的十六进制字符串,我想在两端保存它,这样两个字符串的一端都可以进行加密,另一端可以进行解密 但不知何故,这把钥匙不被接受。拉威尔抛出: 唯一支持的密码是密钥长度正确的AES-128-CBC和A

我使用Laravel5.7,有两个应用程序在不同的服务器上运行。我想与加密通信。所以两端都需要有一个特定的键。默认laravel加密设置为AES-256-CBC

所以我想,我需要这样一个32字节的密钥:

$key=bin2hex(openssl_随机_伪_字节(32,$cstrong))

我得到了一个64长的十六进制字符串,我想在两端保存它,这样两个字符串的一端都可以进行加密,另一端可以进行解密

但不知何故,这把钥匙不被接受。拉威尔抛出: 唯一支持的密码是密钥长度正确的AES-128-CBC和AES-256-CBC

我还尝试将其设置为16字节,使用32个字符的键。也不起作用

但是,它确实可以使用16个字符的键将其设置为8位。但这对我来说毫无意义

Laravel本身使用类似于以下内容的键: base64:X,其中X=44个字符串

我在某处读到AES-256-CBC需要一个64个字符的密钥,其中44个字符应该是base64。我不确定这是否正确,但我很难做到这一点。如何读取具有此前缀base64:的密钥?如何将其恢复为常规字符串

现在我已经决定使用这个16个字符的字符串,但似乎不正确。那么,如何生成有效的AES-256-CBC密钥,以及如何存储它呢?如果需要base64,它是如何工作的?对生成的64位十六进制键进行编码会返回88个字符的字符串


非常感谢您的帮助。

我自己无法尝试此功能,但请查看源代码:

因此,调用
random_bytes()
(或其openssl等价物)就是您所需要做的一切,或者请求16个字节(对于AES-128-CBC)或者32个字节(对于AES-256-CBC)。这是有道理的,因为最终AES的密钥只不过是一堆随机字节

可能让您感到困惑的是术语
字符串的用法。与通常使用的类型
string
不同,在本例中,它不是一个可打印的字符串,而是一个字节的集合,16或32个字节

这就是为什么有人进来。它允许您仅通过ASCII字符来表示字节集合。我怀疑您所引用的“base64:X,其中X=44 character string”值是在某个配置文件中找到的,该文件通常只应包含可读字符。事实上,将32字节转换为Base64格式将产生44个字符。在这种情况下,
base64:
前缀仅用于指示值以base64格式存储

举例说明所有这些:

$key = random_bytes(32);
var_dump($key);
var_dump(base64_encode($key));
给予

后者是存储密钥的方便格式

附言:提及

在使用Laravel的加密机之前,必须在密码中设置密钥选项 config/app.php配置文件。您应该使用php artisan 键:生成生成此键的命令

也许该命令可以完成您试图自己完成的所有操作?

Laravel使用的是专为端到端加密而设计的。因此,这意味着您可以从数据库安全地加密和解密数据,但它不是为大众通信加密而设计的

PHP7.2+与LibNasdaq紧密结合:不赞成使用您自己的宅地加密方法。您可以在
php.ini
配置中启用扩展,也可以使用配置编译php。你可以

假设Bob想给Alice发个信息。Bob和Alice都需要密钥对来加密和解密消息或数据

sodium_crypto_box_keypair();
这些数据应该存储在数据库中,并且可以使用相互转换器或后者(如
base64*
)来实现。每个用户应持有一个唯一的密钥对,该密钥对可在帐户注册时颁发

您可以通过追加您的Laravel
\App\User.php
文件并添加一个新的可填充的
密钥对来实现这一点。在表用户上创建新的迁移,添加列键对,如下所示:

public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->string('key_pair')->unique()->nullable();
    });
}
然后转到您的
App\Http\Controllers\Auth\RegisterController.php
文件并附加
create
方法

当您现在想要加密时,可以引用用户密钥对。以鲍勃为例:鲍勃的id是1。让我们以爱丽丝为例:爱丽丝的id是2

$bob   = User::find(1);
$alice = User::find(2);
现在,我们可以对来自Bob的消息进行加密,并通过创建如下所示的钠加密框将其发送给Alice:

$kp = sodium_crypto_box_keypair_from_secretkey_and_publickey(
    sodium_crypto_box_secretkey($bob->keypair),
    sodium_crypto_box_publickey($alice->keypair) # Encrypt with Alices Public Key
);

$cbox = sodium_crypto_box(base64_encode('Hello, Alice. This is Bob.'), ($nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES)), $kp);
我们现在可以把IV,或者更确切地说是nonce,和Cypto盒子发送给Alice。如果Alice现在想阅读消息,她可以使用她的私钥和Bobs公钥来阅读

$kp = sodium_crypto_box_keypair_from_secretkey_and_publickey(
    sodium_crypto_box_secretkey($alice->keypair),
    sodium_crypto_box_publickey($bob->keypair) # Decrypt with Bobs public key
);

echo base64_decode(sodium_crypto_box_open($cbox, $nonce, $kp));

我希望使用libnaude使加密和签名消息更容易。我希望这有助于理解这个概念以及如何使用加密和存储
base64*
后者。

base64
是存储的完美双向转换器。我建议使用内置的PHP扩展,如libnaude(PHP7.2+)进行IV转换(nonce)
random\u字节(naude\u CRYPTO\u NONCEBYTES)
,并使用
naudi\u CRYPTO\u BOX
进行加密。我想让它更容易。对于使用后者的概念,这是一个很好的答案。
$kp = sodium_crypto_box_keypair_from_secretkey_and_publickey(
    sodium_crypto_box_secretkey($bob->keypair),
    sodium_crypto_box_publickey($alice->keypair) # Encrypt with Alices Public Key
);

$cbox = sodium_crypto_box(base64_encode('Hello, Alice. This is Bob.'), ($nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES)), $kp);
$kp = sodium_crypto_box_keypair_from_secretkey_and_publickey(
    sodium_crypto_box_secretkey($alice->keypair),
    sodium_crypto_box_publickey($bob->keypair) # Decrypt with Bobs public key
);

echo base64_decode(sodium_crypto_box_open($cbox, $nonce, $kp));