我需要使用 SQL Server 2005、asp.net 和 ado.net 编写一个 Web 应用程序。此应用程序中存储的大部分用户数据都必须加密(读取 HIPAA)。
过去对于需要加密的项目,我在应用程序代码中加密/解密。但是,这通常用于加密密码或信用卡信息,因此在几个表中只有少数列。对于这个应用程序,多个表中的更多列需要加密,因此我怀疑将加密职责推入数据层会更好,特别是考虑到 SQL Server 2005 对多种加密类型的本机支持。(如果有人有真实的经验证据,我可能会被说服。)
我咨询过 BOL,我相当擅长使用 google。所以我不想要在线文章或 MSDN 文档的链接(我可能已经阅读过它)。
到目前为止,我已经想到的一种方法是使用使用证书打开的对称密钥。
所以一次性设置步骤是(理论上由 DBA 执行):
- 创建主密钥
- 将主密钥备份到文件,刻录到 CD 并在异地存储。
- 打开主密钥并创建证书。
- 将证书备份到文件,刻录到 CD 并异地存储。
- 使用证书创建具有所选加密算法的对称密钥。
然后,每当存储过程(或通过 Management Studio 的人类用户)需要访问加密数据时,您必须首先打开对称密钥,执行任何 tsql 语句或批处理,然后关闭对称密钥。
然后就 asp.net 应用程序而言,在我的例子中是应用程序代码的数据访问层,数据加密是完全透明的。
所以我的问题是:
我是否要打开、执行 tsql 语句/批处理,然后关闭存储过程中的所有对称密钥?我看到的危险是,如果 tsql 执行出现问题怎么办,并且代码 sproc 执行永远不会到达关闭密钥的语句。我假设这意味着密钥将保持打开状态,直到 sql 杀死 sproc 执行的 SPID。
我是否应该考虑对我需要执行的任何给定过程进行三个数据库调用(仅在需要加密时)?一次数据库调用打开密钥,第二次调用执行存储过程,第三次调用关闭密钥。(每个调用都包含在自己的 try catch 循环中,以最大化打开密钥最终关闭的几率。)
我需要使用客户端事务(意味着我的代码是客户端,并启动事务,执行几个 sproc,然后假设成功提交事务)有什么注意事项吗?