我想使用TDE,但我不能使用它,所以我选择使用EncryptByCert和DecryptByCert函数。但是,我还在考虑加密/解密c#中的数据,如here所示。
我的问题是EncryptByCert和DecryptByCert不安全,因为证书也存储在数据库中?人们如何解决这个问题?
使用c#内置加密更好吗?
提前感谢您的帮助。 :)
答案 0 :(得分:2)
必须部署Encryption Hierarchy: SQL Server Encryption Hierarchy http://i.msdn.microsoft.com/dynimg/IC272034.gif
使用的根密钥可以是服务主密钥(实际上root是服务密码,但这对服务启动是透明的),在这种情况下,应用程序只需连接到数据库并解密就可以访问数据它。如果数据库文件意外丢失,这可以保护数据,但不保护数据免受服务器访问受损:因为解密密钥由服务器本身(服务主密钥)保存,然后任何人有权访问数据的人可以看到数据,因为任何人都可以解密它。数据受到正常访问权限和权限的保护,但加密不会对授权用户添加任何保护。
另一种选择是依赖于根加密层次结构中的密码,在这种情况下,应用程序必须要求用户输入密码才能访问数据。例如,如果是网站,则用户必须填写数据解密密码才能访问特定页面。这样可以真正保护数据不受通过普通数据访问权限访问数据且不知道密码的用户的攻击。</ p>
SQL Server 2008还提供了利用硬件TPM存储解密密钥(即员工徽章)的可能性,但这只是企业版功能。
最终,询问SQL Cryptographic API是安全还是不安全是一个非问题。 API本身当然是安全的。只要私钥得到适当保护,使用对称密钥对数据进行加密,然后使用证书加密对称密钥并将证书的私钥与数据一起存储在数据库中是安全的。密码管理的安全性或不安全性总是最终由密钥管理驱动(一些错误的实现,但让我们假设实现是完美的),密钥管理是1%的应用程序设计和99%的人工流程。
最终,你需要做一个严肃的threat modeling(对不起,但“威胁是数据是私人信息,不应该看到纯文本。”不是威胁建模)。遵循STRIDE或其他类似方法的方法。这是一个非常困难的领域,并且看起来很容易阅读加密API并且相信您知道如何保护数据:
The world is full of bad security systems designed by people who read Applied Cryptography