Php 生成正确的AES-256-CBC密钥/如何存储?
我使用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个字符的字符串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
非常感谢您的帮助。我自己无法尝试此功能,但请查看源代码: 因此,调用
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));