Как я могу динамически изменять ключи, которые Crypt использует в Laravel? - PullRequest
0 голосов
/ 29 января 2019

Я изучал, как использовать Laravel Encryption , поскольку создание платформы шифрования в усадьбе осуждается и справедливо.

Illuminate\Support\Facades\Crypt::encryptString('This is a secret message from user 1 to user 2');

Возьмите приведенный выше пример, это использует мой APP_KEY, который получен из моего .env файла, ранее сгенерированного php artisan key:generate.Проблема заключается в том, что пользователю 1 никогда не выдаются два набора ключей для передачи только пользователю 2. Пользователь 3, 4 и т. Д. Все еще может прочитать это сообщение, используя метод Illuminate\Support\Facades\Crypt::decryptString.

В настоящее время в моей базе данных есть заголовок чата.Это содержит информацию о , что сообщает.Все участники будут использовать эти ключи для шифрования и дешифрования - таким образом, любые внешние пользователи не смогут расшифровать сообщения.

public function up()
{
    Schema::create('chat_headers', function(Blueprint $table) {
        $table->increments('id');

        $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
        $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));

        $table->string('private_key')->unique();
        $table->string('public_key')->unique();
    });
}

У меня также есть участники чата, в них содержится информация о who общается:

public function up()
{
    Schema::create('chat_participants', function(Blueprint $table) {
        $table->increments('id');

        $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
        $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));

        $table->integer('user_id')->unsigned();

        # TODO: Build RBAC

        $table->index(['user_id']);
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    });
}

Наконец, у меня есть таблица для журналов сообщений.Это содержит зашифрованное сообщение, за которым следует, с какой комнатой чата они ассоциируются.

public function up()
{
    Schema::create('chat_messages', function(Blueprint $table) {
        $table->increments('id');

        $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
        $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));

        $table->integer('chat_id')->unsigned();
        $table->string('message');

        $table->index(['chat_id']);
        $table->foreign('chat_id')->references('id')->on('chat_headers')->onDelete('cascade');
    });
}

Как я могу динамически назначать новые ключи для Illuminate\Support\Facades\Crypt, чтобы использовать их для шифрования сообщений между участниками чата?

Если это невозможно, как я могу защитить сообщения между участниками чата, используя эти два ключа?Я чувствую, что использую Crypt, потому что это «шифрование ради него», а не скрытие содержимого чего-либо между пользователями.

1 Ответ

0 голосов
/ 15 августа 2019

Я бы не рекомендовал использовать фасад Crypt напрямую и вместо этого рекомендовал бы использовать Laravel Illuminate \ Encryption \ Encrypter, который является классом, который используется для фасада Crypt (я на Laravel 5.6).

Вот небольшой фрагмент кода, который, я надеюсь, поможет:

use Illuminate\Encryption\Encrypter;

//Keys and cipher used by encrypter(s)
$fromKey = base64_decode("from_key_as_a_base_64_encoded_string");
$toKey = base64_decode("to_key_as_a_base_64_encoded_string");
$cipher = "AES-256-CBC"; //or AES-128-CBC if you prefer

//Create two encrypters using different keys for each
$encrypterFrom = new Encrypter($fromKey, $cipher);
$encrypterTo = new Encrypter($toKey, $cipher);

//Decrypt a string that was encrypted using the "from" key
$decryptedFromString = $encrypterFrom->decryptString("gobbledygook=that=is=a=from=key=encrypted=string==");

//Now encrypt the decrypted string using the "to" key
$encryptedToString = $encrypterTo->encryptString($decryptedFromString);

Если вы хотите увидеть код загрузки фасада, он находится в vendor \ laravel \ framework \ src \ Illuminate \ Encryption \ EncryptionServiceProvider.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...