Laravel использует Подсветка \ Поддержка \ Фасады \ Крипта , которая предназначена для сквозного шифрования. Это означает, что вы можете надежно шифровать и дешифровать свои данные из базы данных, но она не предназначена для шифрования массовой коммуникации.
PHP 7.2+ поставляется вместе с LibSodium: он не одобряет использование собственных методов шифрования. Вы можете включить расширение в вашей конфигурации php.ini
или скомпилировать PHP с этой конфигурацией. Вы можете читать больше на документах .
Допустим, Боб хочет отправить Алисе сообщение. Бобу и Алисе нужны пары ключей для шифрования и дешифрования сообщений или данных.
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
.
Теперь, когда вы хотите зашифровать, вы можете ссылаться на пару ключей пользователя. Давайте возьмем Боба: Боб имеет идентификатор 1. Давайте возьмем Алису: Алиса имеет идентификатор 2.
$bob = User::find(1);
$alice = User::find(2);
Теперь мы можем зашифровать сообщение от Боба и отправить его Алисе, создав натриевый криптобокс примерно так:
$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, или лучше известную как одноразовый номер, и коробку с cyprto. Если Алиса сейчас хочет прочитать сообщение, она может использовать свой закрытый ключ и открытый ключ Бобса для чтения.
$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));
Я создал контейнер для упрощения шифрования и подписывания сообщений с помощью LibSodium. Я надеюсь, что это помогает понять концепцию и как использовать шифрование и хранить с base64*
последним.