【发布时间】:2019-10-14 16:49:14
【问题描述】:
我正在使用 Laravel 框架来加密 MySQL 数据库中的几乎所有数据。由于隐私问题,这是一项要求。
Laravel 使用特定于应用程序的 APP_KEY 作为主密钥来处理加密和解密(OpenSSL / AES-256-CBC 密码)。
我想知道:在用户群上生成 APP_KEY 是否容易(或者是否有软件包)?所以每个用户都有一个 APP_KEY(例如 USER_APP_KEY)来处理所有用户特定的数据?
我认为这增加了一个额外的安全层。因此,即使数据被盗并且某个用户以某种方式被解密,其余数据对攻击者仍然无用。
还是我把事情复杂化了,单个 APP_KEY 是否足够安全?
已经试过了:
搜索现有的 Laravel 框架包。 通用 Google 搜索示例。
【问题讨论】:
-
如果每个用户都有自己的密钥,那么该密钥必须存储在某个地方。出于实际目的,可能与用户数据一起在数据库的某个地方。这将密钥放在加密数据旁边。这使得整件事变得毫无意义。
-
当前,APP_KEY 存储在 webroot 外部文件系统中的 .env 变量中。一种解决方案是在 webroot 之外添加某种数据结构,将用户链接到自己的 APP_KEY。
-
您可以结合 user_id 和静态键,因为您在用户表 id 字段的 id 列中有主键,因此每次都会生成 diff 键。
-
@Peer 这通常不是明智的做法。 Web 服务器应该是无状态且可扩展的,因此假设您有多个该服务器的实例在运行以达到负载平衡的目的。在这种情况下,除了数据库之外,还需要在 Web 服务器上存储数据变得相当不切实际。
-
一般来说,只有在攻击者没有密钥的情况下,加密才有意义。您应该问自己攻击者获取数据的概率是多少,但不是关键。如果您将密钥存储在某处的文件/环境变量中,那么他们很可能会在攻击您的服务器时将密钥与数据一起获取。加密数据库数据有用的唯一情况是备份泄漏,例如,没有随附的密钥。那可能性有多大?加密备份就足够了吗?您真正要防范什么?
标签: laravel encryption architecture