asp.net - SQL Server 2005 加密、asp.net 和存储过程

标签 asp.net sql-server-2005 encryption

我需要使用 SQL Server 2005、asp.net 和 ado.net 编写一个 Web 应用程序。此应用程序中存储的大部分用户数据都必须加密(读取 HIPAA)。

过去对于需要加密的项目,我在应用程序代码中加密/解密。但是,这通常用于加密密码或信用卡信息,因此只有几个表中的少数列。对于这个应用程序,需要对多个表中的更多列进行加密,因此我怀疑将加密职责插入数据层会更好地执行,特别是考虑到 SQL Server 2005 对多种加密类型的 native 支持。 (如果有人有真实的经验证据,我可能会被说服。)

我咨询过 BOL,而且我相当擅长使用 google。所以我不想链接到在线文章或 MSDN 文档(我可能已经阅读过)。

到目前为止,我一直在思考的一种方法是使用使用证书打开的对称 key 。

所以一次性设置步骤是(理论上由 DBA 执行):

  • 创建主 key
  • 将主 key 备份到文件,刻录到 CD 并异地存储。
  • 打开主 key 并创建证书。
  • 将证书备份到文件,刻录到 CD 并异地存储。
  • 使用证书创建具有所选加密算法的对称 key 。

  • 然后任何时候存储过程(或通过 Management Studio 的人类用户)需要访问加密数据,您必须首先打开对称 key ,执行任何 tsql 语句或批处理,然后关闭对称 key 。

    然后就asp.net应用程序而言,在我的例子中应用程序代码的数据访问层,数据加密是完全透明的。

    所以我的问题是:
  • 我想在 sproc 中打开、执行 tsql 语句/批处理,然后关闭对称 key 吗?我看到的危险是,如果 tsql 执行出现问题,并且代码 sproc 执行永远不会到达关闭 key 的语句,该怎么办。我认为这意味着 key 将保持打开状态,直到 sql 杀死在其上执行 sproc 的 SPID。
  • 我是否应该考虑为我需要执行的任何给定过程(仅在需要加密时)进行三个数据库调用?一次数据库调用打开 key ,第二次调用执行 sproc,第三次调用关闭 key 。 (每个调用都包含在自己的 try catch 循环中,以最大限度地提高打开的 key 最终关闭的几率。)
  • 我是否需要考虑使用客户端事务(意味着我的代码是客户端,并启动一个事务,执行多个 sproc,然后假设成功提交事务)?
  • 最佳答案

    1) 研究在 SQL 2005 中使用 TRY..CATCH。不幸的是,没有 FINALLY,因此您必须分别处理成功和错误情况。

    2) 如果 (1) 处理清理,则不需要。

    3) SQL Server 的客户端和服务器事务之间没有真正的区别。 Connection.BeginTransaction() 或多或少地在服务器上执行“BEGIN TRANSACTION”(System.Transactions/TransactionScope 也是如此,直到它被提升为分布式事务)。至于在事务中多次打开/关闭 key 的问题,我不知道有什么需要注意的问题。

    关于asp.net - SQL Server 2005 加密、asp.net 和存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59926/

    相关文章:

    asp.net - 下载文件名为 ";"或 "#"的文件会破坏文件名

    c# - 使用 mvc 4 中的模型根据出生日期验证年龄

    c# - ASP.NET 应用程序可以作为本地主机访问,但不能通过 127.0.0.1 访问

    xml - SQL 2005 和 SQL 2008 使用 XML 插入多行的区别

    sql-server - SQL Server 将变量 varchar 字段转换为金钱/小数/带小数位的内容

    encryption - 非对称加密中的加密和签名有什么区别?

    c# - ASP.NET 从 bin 文件夹加载非托管 dll

    sql-server - 提高数据库性能最快的方法是什么?直接瞄准我的目标(5000 个用户)?或者首先使用人工里程碑?

    java - 如何将解密的文本文件字节 block 转储到 InputStreamReader 中?

    Java 或 Spring : two-way encryption with salt?