Laravel 使用Illuminate\Support\Facades\Crypt,它专为端到端加密而设计。这意味着您可以安全地加密和解密数据库中的数据,但它不是为大众通信加密而设计的。
PHP 7.2+ 与 LibSodium 紧密结合:不赞成使用您自己的宅基地加密方法。您可以在 php.ini 配置中启用扩展,或者使用配置编译 PHP。你可以read more on the docs。
假设 Bob 想向 Alice 发送一条消息。 Bob 和 Alice 都需要密钥对来加密和解密消息或数据。
sodium_crypto_box_keypair();
这些应该存储在数据库中,并且可以使用相互翻译器或后者来完成,例如base64*。每个用户都应持有唯一的密钥对,该密钥对可在帐户注册时颁发。
您可以通过附加您的 Laravel \App\User.php 文件并添加一个新的可填充对象 keypair 来实现此目的。在表 users 上创建一个新的迁移,像这样附加列密钥对:
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->string('key_pair')->unique()->nullable();
});
}
然后转到您的 App\Http\Controllers\Auth\RegisterController.php 文件并附加 create 方法。
当您现在要加密时,可以参考用户密钥对。假设 Bob:Bob 的 id 为 1。假设 Alice:Alice 的 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 和 cyprto 盒子发送给 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));
我built a container 使用 LibSodium 使加密和签名消息更容易。我希望这有助于理解这个概念以及如何使用加密和存储 base64* 后者。