对于 GDPR(欧盟通用数据保护条例)实施,我需要加密一些个人信息。我们可以通过两种方式加密数据:
让 Web 应用程序单独负责加密和解密。数据库中的实际数据是完全加密的。这样,如果数据被盗,数据是安全的(假设我的加密很好)。
在数据库级别启用加密并将访问的 Web 应用程序添加为受信任的客户端。加密和解密发生在数据库本身。这样,如果数据库凭据已知,数据就会丢失。
那么在不影响性能的情况下,哪种方法最好呢?
对于 GDPR(欧盟通用数据保护条例)实施,我需要加密一些个人信息。我们可以通过两种方式加密数据:
让 Web 应用程序单独负责加密和解密。数据库中的实际数据是完全加密的。这样,如果数据被盗,数据是安全的(假设我的加密很好)。
在数据库级别启用加密并将访问的 Web 应用程序添加为受信任的客户端。加密和解密发生在数据库本身。这样,如果数据库凭据已知,数据就会丢失。
那么在不影响性能的情况下,哪种方法最好呢?
让您的数据库处理加密/解密可能是最好的:
有一点支持您已经提到的客户端加密。这是一个很大的,但我不认为它超过了上面的好处:
SELECT * FROM table;
手动解密和过滤每一行,这只是......不会顺利进行。您将把密钥长期保存在可直接通过网络访问的服务器的内存中,作为对攻击者可能发送的请求的直接响应。正如Kevin 指出的那样,您还可以选择加密特定字段。例如,如果您要存储客户的用户名和信用卡号,则后者肯定需要加密,但前者可能不需要。例如,您可以包括一个CHECK
约束,以确保您不会意外添加未加密的信用卡。信用卡号就是一个特别好的例子,因为您永远不需要对它们进行任何类型的匹配——您只需要从数据库中检索它们或将它们存储到数据库中,因此您可以从客户端有效地处理它们。
但是,请注意,良好的安全性不是一回事。良好的安全性是正确的:
无论您如何处理数据库,这都不是路的尽头。确保你照顾好一切。
在其数据库的每个字段或每个字段组的基础上添加加密似乎是最好的折衷方案,前提是在每个字段被加密的同时还创建了一个索引字段。
你会一次解决几个问题。
最新趋势是将私钥存储在作为硬件安全模块的 HSM 中。有一些选项可以将密钥标记为不可从 HSM 中导出。需要加密的数据被发送到 HSM,但是如果数据量很大,它可能会影响性能。如果密钥是可导出的,它只会被导出并保存在内存中以供应用程序用于加密。导出密钥时,应首先使用 HSM 中的另一个公钥对其进行加密,然后将其发送到应用程序。由于应用程序有它的私钥,它可以解密我们的主加密密钥。现在的问题是这个密钥应该存储在哪里?它可以存储在访问受限的数据库中。