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

Jon*_*Jon 6 asp.net encryption sql-server-2005

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

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

我咨询了BOL,而且我很擅长使用谷歌.所以我不希望链接到在线文章或MSDN文档(可能我已经阅读过了).

到目前为止,我已经掌握了一种方法是使用一个使用证书打开的对称密钥.

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

  1. 创建主密钥
  2. 将主密钥备份到文件,刻录到CD并存储在场外.
  3. 打开主密钥并创建证书.
  4. 将证书备份到文件,刻录到CD并存储在场外.
  5. 使用证书创建具有所选加密算法的对称密钥.

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

那么就asp.net应用程序而言,在我的情况下是应用程序代码的数据访问层,数据加密是完全透明的.

所以我的问题是:

  1. 我是否要打开,执行tsql语句/批处理,然后在sproc中关闭对称密钥?我看到的危险是,如果tsql执行出现问题,代码sproc执行永远不会到达关闭密钥的语句.我假设这意味着密钥将保持打开,直到sql杀死sproc执行的SPID.

  2. 我应该考虑为我需要执行的任何给定过程进行三次数据库调用(仅在需要加密时)?一个数据库调用打开密钥,第二个调用执行sproc,第三个调用关闭密钥.(每个调用都包含在自己的try catch循环中,以最大化开放键最终关闭的几率.)

  3. 我需要使用客户端事务的任何注意事项(意味着我的代码是客户端,启动事务,执行多个sprocs,然后假定成功提交事务)?

Bra*_*non 3

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

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

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