我一直在研究如何使用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
是为了“为此加密”,实际上并没有在用户之间隐藏任何内容。
答案 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中。