首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应用数据加密与数据库数据加密

应用数据加密与数据库数据加密
EN

Security用户
提问于 2019-07-08 10:15:52
回答 3查看 7.1K关注 0票数 19

对于GDPR (欧盟通用数据保护条例)的实施,我需要加密一些个人信息。有两种方法可以加密数据:

  • 让web应用程序完全负责加密和解密。数据库中的实际数据是完全加密的。这样,如果数据被窃取,数据是安全的(假设我的加密是好的)。
  • 在数据库级别上启用加密,并将访问web应用程序添加为受信任的客户端。加密和解密发生在数据库本身。这样,如果知道数据库凭据,数据就会丢失。

那么,哪一种方法是最好的,而不牺牲太多的性能?

EN

回答 3

Security用户

发布于 2019-07-08 14:59:18

让数据库处理加密/解密可能是最好的方法:

  1. 您不需要编写任何加密/解密代码,也不需要冒险意外地破坏您自己的安全性。这也意味着,作为甘特伦·布洛姆 指出,您不必证明自己的安全性是安全的,如果是这样的话。而且,要证明您的自定义软件的安全性就像您可能认为的那样困难,如果不是更多的话。
  2. 使用内置到数据库中的内容通常更容易,例如,波斯特格斯允许您选择要加密的列和表,并且它们的设计只在服务器上有简单的密钥和解密数据。其他数据库可能类似,但这是我唯一熟悉的数据库。
  3. 如果您需要根据数据生成报表,那么使用支持加密数据库的现有工具比自己在客户端编写所有自定义代码要简单得多。
  4. 如果您需要对不准确、区分大小写值的数据进行任何筛选,数据库将有效地为您处理这些数据,例如维护索引,但在需要之前将其加密,甚至只有在任何给定时间解密它们所需的特定值。

有一点有利于客户端加密,您已经提到了这一点。这是一个很大的问题,但我不认为它比上面的好处更重要:

  1. 如果在客户端处理所有加密/解密,您的安全性将略有提高,因为数据库(因此,控制该服务器的任何邪恶系统管理员/攻击者)都不知道解密密钥或解密数据。但是,根据数据及其使用情况,有一些缺点需要考虑:
    • 您完全有可能破坏客户端加密代码,并以这种方式泄漏数据/密钥,无论是直接泄漏还是通过侧通道泄漏。
    • 您需要信托 局外人或自己处理密钥管理,这并不简单(而且在代码中支持也不是那么简单,如果您想避免经常计划的停机时间)
    • 如果你搞砸了你的代码,你一个人(好吧,你的公司--你知道我的意思)负责修复它和清理损坏,任何修复都可能和你的原始代码一样有错误。考虑到你的压力可能更大。
    • 您将不得不花费大量的时间进行性能调优,或者接受您的性能会很差,或者降低安全性以获得轻松的性能增益(例如,通过短路比较或预先计算一些常量或让编译器优化错误的位数)。所有这些都不是好事情。数据库服务器已经有很多人在做大量的调优;您将从头开始重新完成所有这些工作。
    • 对于每一个新的开发人员,您都需要对他们进行良好的安全编码实践培训,或者告诉他们不要触及代码中与安全相关的部分,这两种代码都不具有成本效益,甚至一般都不可靠。
    • 如果您需要实现模糊过滤客户端,基本上您将不得不执行SELECT * FROM table;,手动解密和过滤每一行,这只是.不会顺利的。您将在内存中将密钥保存在可直接访问web的服务器中很长一段时间,作为对攻击者可以发送的请求的直接响应。

作为凯文 指出,您还可以选择加密特定字段。例如,如果您正在存储客户的用户名和信用卡号码,后者肯定需要加密,但前者可能不需要加密。您可以包括一个CHECK约束,以确保您不会意外地添加未加密的信用卡。信用卡号码就是一个很好的例子,因为你从来不需要对它们做任何匹配--你只需要从数据库中检索或存储它们,这样你就可以从客户端高效地处理它们。

然而,请注意,良好的安全性并不是一回事。好的安全就是做好一切:

  • 分析您的威胁模型,以确保您正在防范正确的威胁
  • 在您的整个网站上使用HTTPS和有效的当前证书。
  • 以某种方式加密数据库
  • 加密网站与数据库之间的通信
  • 正确使用SQL以避免SQL注入
  • 强化数据库服务器以保护其免受攻击。
  • 应用最小特权原则
  • 还有更多。

不管你如何处理你的数据库,这并不是道路的尽头。确保你能照顾好一切。

票数 31
EN

Security用户

发布于 2019-07-08 15:24:14

在每个字段或每组字段的基础上添加加密似乎是最好的折衷,前提是在每个字段被加密的同时创建索引字段(S)。

你会同时解决几个问题。

  1. 搜索索引也会同样快
  2. 并非所有字段都需要加密。
  3. 加密开销保持在最低限度,重点放在GDPR上。
  4. 每个字段的不同密码可以用于不同的终端用户,因为特权允许。
票数 3
EN

Security用户

发布于 2020-03-08 00:41:21

最新的趋势是在HSM中存储私钥,这是硬件安全模块。在HSM中,有一些选项可以将键标记为不可出口。需要加密的数据被发送到HSM,但是在大量数据的情况下,它可能会影响性能。如果密钥是可导出的,它将只被导出并保存在内存中,以供应用程序用于加密。导出密钥时,首先应该使用HSM中的另一个公钥加密密钥,然后将其发送到应用程序。由于应用程序有它的私钥,所以它可以解密我们的主加密密钥。现在的问题是,这个密钥应该存储在哪里?它可以存储在访问权限有限的数据库中。

票数 0
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/213146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档