Я изучал, как использовать 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
, потому что это «шифрование ради него», а не скрытие содержимого чего-либо между пользователями.