1

我有一个 SQL Server 2005 数据库,我计划使用 PassByPhrase 加密我的一些列。但是这些列必须以原始形式显示在我的 ASP.Net 网页和一些 Crystal Reports 上。现在我知道,每次我的类(显示数据)访问数据库时,我都必须创建一个存储过程来解密列并运行这个存储过程。但是,如果我将密码存储在某个存储过程中,那么任何有权访问数据库的人都可以打开存储过程并获取密码的值。那么加密的意义何在?

所以我的问题是:

  1. 如何在 ASP 网页或 Crystal Report 上显示我的加密列(以其原始形式)?

  2. 我应该如何存储我的密码?

4

1 回答 1

1

没有灵丹妙药。当服务必须代表用户访问数据时,您看到的问题始终存在。加密不能替代访问保护。如果您需要显示加密数据,则必须出示解密密钥。只有两种可能:

  1. 您要求用户输入密码。用户输入密码(在 web 中,或在水晶中),然后您使用密码来解密数据。如果用户想要保护数据免受的侵害,这将非常有效。数据受到密码学保护,即使对数据具有读取权限的用户仍然无法在不知道密码的情况下解密数据。在实践中也基本不可能实施。
  2. 您将加密密钥存储在最终植根于服务主密钥的密钥层次结构(对称密钥->证书->主密钥->服务主密钥)中,因此在 OS DPAPI 中。请参阅加密层次结构。这样就可以访问 SQL Server 服务本身的解密密钥,因此任何有权访问服务器的用户都可以通过简单地要求服务器为他解密数据来解密数据。在服务器上,数据仅受访问保护(授予/拒绝/撤销 SELECT 权限)的保护。然而,数据受到保护以防止意外的媒体丢失,这通常是真正的要求。当许可不允许TDE时,这通常用作穷人解决方案。

这就是全部。其他任何东西要么是加密层次主题的变体(例如,将密码存储在受保护部分下的 ASP.Net 配置文件中),要么是普通的旧蛇油(例如在应用程序代码中嵌入密码)。

于 2013-09-17T18:32:26.887 回答