在ASP .NET 2.0和SQL Server 2005中加密工资值
我有一个连接到SQL Server 2005数据库的ASP .NET 2.0网站。该网站非常简单,并存储有关员工的信息,包括薪水。
加密工资值的最佳方法是什么,以便除授权用户使用Web应用程序外,没人能看到工资值(包括我自己)吗?
我不想在SQL Server上进行加密/解密,因为我可以运行SQL Profiler来查看信息,所以我假设加密/解密发生在Web服务器上的BLL中?
另外,我是否需要SSL来阻止某人嗅探浏览器和Web服务器之间的HTTP响应?
非常感谢!
安东尼
解决方案
SSL可能是阻止某人进行嗅探的最佳选择,但请注意,这仍然是可能的。
至于其他方面,SQL Server 2005开箱即用地支持表级加密。这是一篇文章。我们可以创建一个链接到雇员的SALARY表,并对该表进行加密。
我们可以在代码中使用许多加密方法。确保选择一个带有键和"盐"的键(而不是每次都使用相同的键)。如果每次加密工资时都使用相同的密钥(不加盐),则具有相同工资的两名员工将在数据库中显示相同的加密值,从而损害了工资信息的安全性。
我们可以使用每个员工的唯一ID作为盐。
我们绝对需要SSL来防止嗅探敏感的网络流量(更不用说登录)了,但这并不能解决服务器端加密问题。
开发人员无法访问数据,这使我们难以克服。为了使其真正起作用,所有加密/解密仅需要在我们无权访问的计算机上进行。从理论上讲,我们将必须进行某种浏览器扩展,以解密客户端计算机上的薪水数据。雇主必须对我们足够信任,不要在客户端代码中放置后门(或者至少拥有对代码进行审核的可能性)。
在大多数情况下,更容易信任开发人员不公开数据。保持需要了解是一个好主意,但最终有些人需要知道。 (例如,会计人员一直在查看薪水数据。)
我们绝对想使用SSL来提高运输安全性。我们还可以设置IPSec,以在Web服务器和数据库服务器之间进行传输。
关于数据库安全,SQL Server 2005具有多种加密功能:
1)EncryptByAsymKey http://msdn.microsoft.com/en-us/library/ms186950.aspx
2)EncryptByKey http://msdn.microsoft.com/en-us/library/ms174361.aspx
3)EncryptByPassPhrase http://msdn.microsoft.com/en-us/library/ms190357.aspx
4)EncryptByCert http://msdn.microsoft.com/en-us/library/ms188061.aspx
显然,所有这些都具有关联的解密功能。
我们可以将密钥或者我们选择的任何密钥存储在Web服务器上(在machine.config或者web.config或者某处),然后将其传递到存储过程(或者以某种方式与sql一起)进行加密。
Webapp的开发人员仍然可以访问薪水数据-这完全是信任的问题。为了解决这个问题,我们可以切换到在客户端进行加密/解密的模型,但这比较麻烦并且仍然不是100%安全的。安全总是要权衡便利性。
我们应该使用TLS / SSL(即HTTPS),以便更难以进行HTTP流量的窃听。
我们可能考虑的一种攻击方式是,将感兴趣的人替换为自己的加密工资数字,然后致电会计部门,询问我们当前的工资数字是多少。消除攻击的一种方法是让加密的薪水字段的内容引用其所属的人。