代码之家  ›  专栏  ›  技术社区  ›  Jaquarh

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

  •  1
  • Jaquarh  · 技术社区  · 5 年前

    我一直在研究如何使用 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从未获得两组密钥来通信 只有 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 因为这是“为了它而加密”,而不是实际上在用户之间隐藏任何内容。

    0 回复  |  直到 5 年前
        1
  •  5
  •   pwyg    5 年前

    我建议不要直接使用Crypt facade,而是建议使用laravelillighte\Encryption\Encrypter,它是用于Crypt facade的类(我使用的是laravel5.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);
    

    如果您想查看facade加载代码,它位于vendor\laravel\framework\src\Illuminate\Encryption\EncryptionServiceProvider中。