假设两个程序员正在为一家商店开发网站。他们为一家在线商店创建了一个小型数据库。用户必须注册并提供用户名(电子邮件地址)、密码和家庭住址,并可以选择将信用卡信息存储在他们的帐户中。显然,您不希望攻击者获取任何此类信息。假设其中一名程序员粗心大意,没有过滤 SQL 语句,也没有采取适当措施确保恶意代码不会被接受。正在开发数据库的程序员可以做什么来确保即使攻击者能够在表单中输入 SQL 语句并访问数据库,它也会被加密?在这种情况下,哪种加密效果最好?
我正在寻找的是,如果用户输入了正确的用户名/密码,他将获得对自己帐户的访问权,但如果攻击者使用 SQL 注入,他将获得一个加密数据库,必须攻击该数据库才能获取信息。
注意:程序员使用的是 SQL Sever 2012
答案1
SQL Server 加密用于保护静态数据、保护备份文件并防止某人以原始格式访问数据库数据文件。
它不是为了保护数据不被编写和配置为访问这些数据的应用程序所利用。请记住,通过您的某个应用程序代理对您的基础设施的攻击会使用该应用程序的凭据和权限来执行攻击。这就像将您的家门钥匙交给您卑鄙的姐夫,让他照看狗,但却希望他不能偷您的电视一样。即使您在应用程序层进行了加密,该应用程序也拥有加密的密钥,因此任何攻击者也都有密钥。唯一真正的选择是将密钥与用户绑定,而不是应用程序本身,这样任何用户都无法解密不属于他们自己的 cc 数据。
其次,为了合法存储信用卡数据,您必须满足行业 PCI 安全标准,这远远超出了本论坛的范围。
你的问题的所有内容都告诉我,你永远不应该让你的程序员存储 CC 数据。你们还远远没有达到安全处理数据所需的水平。
编辑:我注意到您已从原帖中删除了所有关于信用卡的引用,因此如果这不是您的目的,请忽略我对 PCI 标准的评论。我对 SQLServer 加密的评论仍然有效。
答案2
请参阅 ASP.Net 会员提供商的 dbo.aspnet_Membership 表。它存储用户级密码盐并在存储密码之前对其进行加密。与您的要求非常相似。
SQL Server 中没有现成的功能,除非您使用加密列的选项。但这样您就不得不使用 varbinary 数据类型,并且还可能面临性能下降(根据某些文章,速度会降低 20%)。请参阅: http://technet.microsoft.com/en-us/library/ms179331.aspx