Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以使用每个用户不同的APP_密钥加密Laravel中的数据?_Laravel_Encryption_Architecture - Fatal编程技术网

是否可以使用每个用户不同的APP_密钥加密Laravel中的数据?

是否可以使用每个用户不同的APP_密钥加密Laravel中的数据?,laravel,encryption,architecture,Laravel,Encryption,Architecture,我正在使用Laravel框架加密MySQL数据库中的几乎所有数据。出于隐私考虑,这是一项要求 Laravel使用特定于应用程序的应用程序密钥作为主密钥来处理加密和解密(OpenSSL/AES-256-CBC密码) 我想知道:在用户基础上生成应用程序密钥是否容易(或者是否有软件包)?那么每个用户都有一个应用程序密钥(即用户应用程序密钥)来处理所有用户特定的数据 我认为这增加了一个额外的安全层。因此,即使数据被盗,并且一个用户以某种方式被解密,其余的数据对攻击者来说仍然是无用的 还是我把事情搞得太复

我正在使用Laravel框架加密MySQL数据库中的几乎所有数据。出于隐私考虑,这是一项要求

Laravel使用特定于应用程序的应用程序密钥作为主密钥来处理加密和解密(OpenSSL/AES-256-CBC密码)

我想知道:在用户基础上生成应用程序密钥是否容易(或者是否有软件包)?那么每个用户都有一个应用程序密钥(即用户应用程序密钥)来处理所有用户特定的数据

我认为这增加了一个额外的安全层。因此,即使数据被盗,并且一个用户以某种方式被解密,其余的数据对攻击者来说仍然是无用的

还是我把事情搞得太复杂了,一个应用程序密钥就足够安全了


已尝试:

搜索Laravel框架的现有包。
通用谷歌搜索示例。

决定只使用一个应用程序键。据我所知,没有一个包可以处理这个问题。根据评论,它在安全性方面没有任何好处。

是的,您可以为每个用户生成密钥并将其存储到
users
表中。 下面的代码示例将生成一个密钥

'key' => encrypt($this->generateRandomString(16))

private function generateRandomString($n) { 

    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; 

    $randomString = ''; 
    for ($i = 0; $i < $n; $i++) { 

        $index = rand(0, strlen($characters) - 1); 

        $randomString .= $characters[$index]; 

    }      

    return $randomString; 

} 
为了增加安全性,我建议您使用APP_密钥加密基于用户的密钥。 然后将加密密钥存储在数据库中

解密时,首先需要解密密钥。之后,您可以使用基于用户的密钥解密内容。 然后有人需要得到的内容需要知道这两个键,即用户键和应用程序键


希望这有帮助。

如果每个用户都有自己的密钥,则该密钥必须存储在某个位置。出于实际目的,可能在数据库中的某个位置与用户数据一起。它将密钥放在加密数据的旁边。这使得整个过程有些毫无意义。目前,一个APP_密钥存储在webroot之外的文件系统中的一个.env变量中。解决方案可能是在webroot之外添加某种数据结构,将用户链接到自己的应用程序密钥。您可以将用户id和静态密钥结合起来,因为在用户表id字段的id列中有主键,所以每次都会生成diff KEY。@Peer这通常不是一种明智的方法。Web服务器应该是无状态和可伸缩的,因此假设您有多个该服务器的实例在运行以实现负载平衡。在这种情况下,除了数据库之外,还需要在web服务器上存储数据变得非常不切实际。通常,只有在攻击者没有密钥的情况下,加密才有意义。您应该问问自己,攻击者获取数据的概率是多少,而不是密钥。如果您将密钥存储在某个文件/环境变量中,那么在攻击您的服务器时,它们很可能会将密钥与数据一起存储。加密数据库数据唯一有用的情况是备份泄漏,例如,没有附带的密钥。这种可能性有多大?加密你的备份就足够了吗?你到底在防范什么?
$encrypter = new \Illuminate\Encryption\Encrypter($key);
$decrypted = $encrypter->decrypt($encryptedContent);