加密SQL数据库中的某些敏感或个人身份识别数据(根据PCI,HIPAA或其他适用的合规标准)被认为是“最佳做法”?
这里有很多关于解决方案的个别方面的问题,但我没有看到任何在高层次上讨论该方法的问题。 在环顾了一段时间之后,我想出了以下内容:
这是否足够?过时了吗?审计,安全吗?鲁莽?
答案 0 :(得分:9)
您的方法很好,我的眼睛有一些调整(我通常会对PCI合规性进行编码):
使用CryptoAPI和Rijndael
至少使用Rijndael / AES256,无论其他API
生成IV并将其与加密数据一起存储
好
使用DPAPI(机器范围)来保护"对称密钥
不确定是否重要。我只是将IV保留在加密的数据旁边,或者如果您在某些其他媒体上真的偏执。确保公众无法使用IV。
将对称密钥存储在注册表或文件或数据库中,拆分密钥并将部件存储在多个位置以增加保护
如果有人窃取您的媒体,在多个地方存储将无法帮助您。将密钥分开是有点矫枉过正,但绝对不要将它与你的IV和/或密文一起存储。那太糟糕了。
除非确实需要,否则不解密数据,即不从数据库读取。相反,将密文保存在内存中。
当然。将密文保存在内存中很好,但不要在任何地方传递它,并且除非绝对必要,否则不要解密,甚至不要将整个未加密的数据集展开 - 只需要提供所需内容从它至少。另外,如果可能的话,不要将密钥保存在内存中 - 内存转储可能会暴露它。
<强>加法:强>
希望这些帮助。其中一些是我个人的意见,但据我所知仍然符合PCI标准。
答案 1 :(得分:1)
我看到之前的评论之一提到如果你使用CryptoAPI并不重要。我只是想指出CryptoAPI符合FIPS 140-2标准,而Bouncy Castle和内置托管类(所有那些用&#34; Managed&#34;在他们的名字末尾的System.Security中)。密码术命名空间)不是。如果您需要符合FIPS标准,那么使用CryptoAPI可能最容易。
答案 2 :(得分:1)
从OWASP(Cryptographic Storage Cheat Sheet)中获得最佳实践的通用列表:
此外,根据Cisco article:
答案 3 :(得分:0)
我想补充一下:
保持IV隐藏并不重要。如果IV是公开的,那就没关系。只需使用好的IV,即使用加密强的随机数生成器,这样你的IV就无法与随机区分开。
将加密密钥与其加密的数据分开存储。
为您的加密添加身份验证。例如,添加一个用第二个对称加密密钥加密的HMAC,覆盖密文。如果您不使用某种形式的经过身份验证的加密,那么您的密文可能会被修改,而您无法知道(AES会很好地解密垃圾。)您希望注意任何对密文的篡改。