SQL Server 2008中加密社会安全号码的最佳方法是什么?

7
我正在使用.NET 3.5和SQL Server 2008开发一个新的Web应用程序,需要存储一些社会安全号码。我已经开始阅读有关数据库加密的初步信息,但有点混淆。
使用非对称密钥加密SSN会很好,因为这样公共面向的应用程序在数据加密后将无法检索任何数据。我认为只有管理界面才能解密和显示数据。但听起来SQL Server只使用对称密钥来保护数据?
那么,在SQL Server 2008中加密SSN的最佳方法是什么?如果您能链接到一两个好的教程,将获得额外的奖励分数。

2
你确定需要存储社会安全号码吗?你真的想要这种巨大的法律责任压在你的肩上吗? - ceejayoz
1
我正在尽力避免这种情况发生。但这将是一个开放的福利计划,如果您添加新的受扶养人,则需要提供社会安全号码等信息。 - Shea Daniels
1
有道理。只是要确保不是仅需要最后四位数字或单向哈希之类的情况。 - ceejayoz
那绝对是很好的建议,我认为。 - Shea Daniels
3个回答

5
如果您加密数据,则必须考虑谁将对其进行解密。如果使用不对称加密系统(例如RSA),则加密使用公钥,而解密使用相应的私钥;“不对称性”源于无法从公钥重新计算出私钥(尽管两个密钥在数学上是相互关联的)。
不对称加密往往会有开销。首先要注意的是,这种加密必须具有某些随机部分,因为每个人都可以进行加密(公钥是公共的):如果加密过程是确定性的,则任何人都可以加密所有可能的社保号码(它们少于十亿,这对于现代计算机来说是一个非常小的数字)并匹配加密值。因此,在加密过程中必须添加一些随机性,并且加密的社保号码大于明文社保号码。
已知的不对称加密系统使用具有自己成本的数学结构。基本上,对于RSA加密系统,使用“足够强大”的密钥,加密消息的长度至少为128字节。一些加密系统做得更好;尽管坚持学术研究的老路线,我可以用大约41个字节(使用NIST K-163椭圆曲线上的El-Gamal)来完成它。似乎较小的更难。
因此,某个数据库系统默认情况下不包括这样的功能也就不足为奇了。对于您的问题,您应该首先定义(并编写)尽可能清楚的内容:
- 您要保护的数据是什么 - 谁输入数据 - 谁应该读回数据
然后,您才应该问自己是否加密是适当的工具。当设想的攻击者可以获取原始存储的数据时,加密非常有效。这意味着攻击者已绕过操作系统保护。此时,无论操作系统知道什么,攻击者都知道。如果数据库托管在一台机器上,并且有一个接口可以通过该接口获取解密的社保号码,则该机器“知道”如何获取数据,攻击者也知道...另一方面,如果主机操作系统被认为足够强大,则根本不需要加密。
数据库上的对称加密可能会解决一个较弱的问题,其中攻击者在之后获得硬盘的副本。主机系统仅在RAM中知道对称加密密钥。窃取硬盘的攻击者将没有该密钥。

针对第二段,对社会保险号进行加盐处理听起来是个好主意。至于第五段:我想要保护的数据就是社会保险号。用户将输入数据,但不会检索它。只有使用不同应用程序的管理员才能读取数据。至于您倒数第二段所说的,存在各种安全漏洞,这些漏洞不一定需要攻击者物理接触机器。在任何情况下,私钥都不会存储在同一台服务器上。 - Shea Daniels

1

如果您必须存储社会安全号(SSN),并且希望它们处于加密状态,我建议使用对称密钥加密机制,如3DES或AES。让加密密钥是某些授权访问数据的人所知道的一些密码短语的派生物,并要求他们每次访问数据时输入。

例如:(10个或更多字符的密码短语) -> SHA-1 => 密钥。

不要指望数据库本身进行加密(虽然肯定要查看像TDE这样的功能,或者运行支持全磁盘或文件加密的主机操作系统作为辅助的整体安全机制),而是使用.NET内置的加密库和读写数据库的任何编程语言。

这样做的好处是您不必存储公钥和私钥或生成这些密钥(这在计算上是昂贵的),而且它们相对较大,因此存储成本更高(相对而言)。此外,当未经授权的用户访问运行代码的机器时(不包括用户输入密码短语时发生的中间人攻击),您也不必担心密钥被泄露。其次,它确保只有经过授权的用户(知道密码)才能解密数据。根据您的预算(时间、精力、资源),您可以添加多因素身份验证,其中加密密钥既来自密码短语,又来自授权用户可能拥有的某些令牌,例如智能卡。第三,使用对称密钥加密算法加密和解密数据将会快得多。


使用对称密钥时,您不需要密码短语来加密数据吗?如果没有任何可以用于在公共方面解密数据的东西,那会让我感到更舒适。 - Shea Daniels
我假设你没有API或机制可以解密那些数据,除非在授权用户访问你的系统时从受控方面进行。 - H. Green
这取决于您所指的“授权用户”的含义。所有这些内容应该已经受到正常存储过程访问控制的保护。例如,我希望有一个额外的安全级别。 - Shea Daniels

1

我认为我理解这样做的原因,如果你有大量数据需要加密。我假设每个数据片段都有自己的对称密钥,然后由共享公钥加密,是吗?但在这种情况下,社会安全号码(SSNs)实际上不比对称密钥小吗? - Shea Daniels

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接