我们正在使用Firebase数据库规则来保护我们的数据库。我们还希望通过加密敏感的用户信息来增加额外的安全性。现在,我们的加密方法是:
在用户将用户数据客户端写入数据库之前,使用公共密钥对其加密 在通过GET请求将数据传递给用户之前,先使用服务器上的私钥进行解密
我们的私钥是在服务器代码中硬编码的字符串。我们希望使用KMS的加密/解密方法保护私钥,并仅在代码中存储加密的私钥。
加密的私钥将存储在服务器代码中,并在运行时使用KMS对其进行解密,这样开发人员将无法访问私钥。
但是,我们不确定使用Cloud KMS是否有更好的方法。 KMS可以同时用于客户端加密和服务器端解密吗?还是使用KMS增强数据库加密的最佳实践是什么?
答案 0 :(得分:2)
您的问题是一个很好的例子,说明了除非您知道自己在做什么,否则为什么不应该实现加密和数据安全性。您的实现存在严重缺陷。询问是个不错的开始,但是还有很多要讲的。
通常,您不使用私钥/公钥对加密数据。公钥加密用于安全地协商对称加密密钥。与对称加密相比,公钥加密在CPU时间上也非常昂贵。
示例。如果要在发送到客户端之前在服务器上解密数据,为什么还要在用户端加密数据?
在服务器代码中硬编码私钥是一种可怕的做法。这几乎可以保证您的密钥对将被泄漏。
是的,使用Cloud KMS对您来说将是一个巨大的进步。这将使安全性更易于实现,并消除了一些管理难题。但是,您将需要了解KMS和加密最佳实践。设计不当的安全性很容易被破坏。设计不当的安全性很容易丢失无法访问的租借数据。
简单来说,您至少需要以下条件:
除非有良好的设计原因或合规性要求,否则您不应该在客户端上加密数据-客户端不应该管理密钥。应使用加密的传输协议安全地传输数据。您的服务器应控制和管理数据库的加密。数据库也应该对静态数据进行加密。
我可以继续下去,这就是为什么有很多关于这个主题的书。
答案 1 :(得分:0)
我认为您的计划听起来不错。是的,您可以通过使用Cloud KMS封装私钥来提高安全性;然后,您可以将包装的密钥放入源代码或应用程序的配置文件中,然后在启动时解开包装以获取私钥。这样一来,您就可以减轻拥有密钥的风险,该密钥可以解密开发人员处理的数据库。
另一种方法是不使用本地加密:相反,您可以在每次写入或检索行时调用KMS来加密和解密数据。这可能会给您带来一些好处(二进制文件甚至都不知道密钥;作为KMS解决方案的一部分,您可以进行轮换等;您可以获取每次密钥使用的日志),但会带来一些成本(您现在需要为每个请求都依赖KMS服务; KMS请求的延迟可能会降低性能;每次访问请求所花费的资金不仅仅只是在启动时就展开;而且您还需要依靠通道加密来保护用户数据在发送到您的计算机上时服务,因为您现在要加密服务端)。
KMS现在还具有非对称加密支持(docs here),因此您可以将两者结合起来:在客户端进行公共密钥加密,然后使用非对称KMS密钥对每个请求进行解密。利弊与上述类似,不同之处在于您可以保持与当前相同的数据公开和客户端加密。
我同意另一个答案,因为服务具有解密的权限,因此在此处进行客户端加密的安全性优势尚不完全清楚。尚不清楚是否对其进行加密也会增加风险。但是,按照您的描述使用公钥并不会明显增加风险(假定您正确正确地进行,而不是小事)。
感谢您的提问和使用Cloud KMS;如果您还有其他需要我们帮助的问题,请告诉我们!
答案 2 :(得分:0)
以前提供的答案是好的答案。我想补充一点,您的问题将在Google Groups上成为一个很好的讨论主题,因为这是一个讨论论坛,可以像这样的问题进行公开讨论并以不同的方式回答,从而为您实现加密提供了不同的意见应用。