如何动态更改Laravel在Crypt中使用的密钥?

时间:2019-01-29 16:08:57

标签: php laravel laravel-5 encryption

我一直在研究如何使用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();
    });
}

我还有一个聊天参与者,其中包含有关正在交流的信息:

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 :(得分:2)

我建议不要直接使用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中。