C# SQL Server加密和nhibernate

C# SQL Server加密和nhibernate,c#,sql,nhibernate,encryption,syntax,C#,Sql,Nhibernate,Encryption,Syntax,我们有一个数据库,它有几个加密列(如所述的对称密钥)。我正试图使用老式的NHybernate 2.1.2.4在一个遗留应用程序中映射这些表 我想我可以使用公式映射加密列,如下所示: <property name="Name" column="Name"> <formula> OPEN SYMMETRIC KEY MyKey DECRYPTION BY CERTIFICATE MyCert SELECT CONVERT(NVARCHAR(150), DE

我们有一个数据库,它有几个加密列(如所述的对称密钥)。我正试图使用老式的NHybernate 2.1.2.4在一个遗留应用程序中映射这些表

我想我可以使用公式映射加密列,如下所示:

<property name="Name" column="Name">
  <formula>
    OPEN SYMMETRIC KEY MyKey DECRYPTION BY CERTIFICATE MyCert
    SELECT CONVERT(NVARCHAR(150), DECRYPTBYKEY(Name)) AS Name FROM [Company] WHERE [Company].[Id] = Id
  </formula>
</property>
这会产生相同的错误,因为Open不返回任何内容,它是一个void语句

有没有办法让NHibernate在别的地方叫Open?可能是在打开连接后或在某个地方处理会话时

否则,是否有有效的SQL语法使该语句在查询中工作

视图、函数和存储过程不是选项,因为它们不符合加密列的目的

----编辑----

在会话打开时执行Open语句并将其放入配置中:

<property name="Name" column="Name" formula="CONVERT(NVARCHAR(150), DECRYPTBYKEY(Name))" />
然后使用
CONVERT(NVARCHAR(150),DECRYPTBYKEY(Name))
读回,我得到了一些有趣的字符效汬潗汲d’back而不是“Hello World”


我想升级我们的SQL2005数据库并使用上面提到的TDE是最好的选择。

加密的目的是什么?通过使用由数据库主密钥加密的证书,任何用户或应用程序都可以解密数据。您不提供加密保护,只提供访问保护(授予/拒绝/撤销对数据和/或密钥的访问权)。加密保护要求用户指定解锁密钥层次结构根所需的密码。您所做的事情具有有效的用途(失去媒体保护),但通过或可以更好地处理它100万倍


至于您的问题:只需在会话中打开密钥(即当您打开连接时)。没有任何理由尝试在按语句访问时按需打开它。

加密的目的是什么?通过使用由数据库主密钥加密的证书,任何用户或应用程序都可以解密数据。您不提供加密保护,只提供访问保护(授予/拒绝/撤销对数据和/或密钥的访问权)。加密保护要求用户指定解锁密钥层次结构根所需的密码。您所做的事情具有有效的用途(失去媒体保护),但通过或可以更好地处理它100万倍


至于您的问题:只需在会话中打开密钥(即当您打开连接时)。没有理由尝试在每语句访问时按需打开它。

对于读取期间的解密,您可以在公式中使用-执行解密,而无需指定开放对称密钥。不幸的是,它是一个公式字段,这意味着它只能用于读取。这篇文章详细介绍了如何实现读写操作,但我承认,正如本系列的作者所做的一样,这篇文章有点粗糙。

对于读取过程中的解密,您可以在公式中使用,该公式执行解密,而无需指定开放对称密钥。不幸的是,它是一个公式字段,这意味着它只能用于读取。这篇文章详细介绍了如何在读写方面发挥作用,但我承认,正如本系列文章的作者一样,这篇文章有点粗糙。

它确实只是为了保护备份和物理数据库文件。从我的角度来看,这是毫无用处的,但从销售的角度来看,显然不是。我想只加密备份文件会更简单。我还预见了更多的问题而不是好处,例如,当我们需要备份以在脱机调试时重现一个实时问题时,或者在升级迁移上进行验收测试时等等。。。但无论如何,我会在打开会话时尝试找到一个入口点。我也会给TDE看一看。我认为BitLocker不会有帮助,因为备份是远程存储的。谢谢。TDE是一项企业功能,因此这可能会取消其资格。但它确实解决了你提到的所有问题。严格地说,列级加密(
DECRYPTBYKEY
)可能(而且很可能会)泄漏
tempdb
中的未加密数据,这可能最终会在跳蚤市场上被丢弃的硬盘上,这是TDE将确保不会发生的事情。它确实只是为了保护备份和物理数据库文件。从我的角度来看,这是毫无用处的,但从销售的角度来看,显然不是。我想只加密备份文件会更简单。我还预见了更多的问题而不是好处,例如,当我们需要备份以在脱机调试时重现一个实时问题时,或者在升级迁移上进行验收测试时等等。。。但无论如何,我会在打开会话时尝试找到一个入口点。我也会给TDE看一看。我认为BitLocker不会有帮助,因为备份是远程存储的。谢谢。TDE是一项企业功能,因此这可能会取消其资格。但它确实解决了你提到的所有问题。严格地说,列级加密(
DECRYPTBYKEY
)可能(而且很可能会)泄漏
tempdb
中的未加密数据,这可能最终会在跳蚤市场上被丢弃的硬盘上,这是TDE将确保不会发生的事情。
ENCRYPTBYKEY(KEY\u GUID('MyKey'),“Hello World”)
必须作为
转换(VARCHAR(150),DECRYPTBYKEY(Name))进行解密。
。ANSI输入必须转换为ANSI输出(即
VARCHAR
)。要输出Unicode,应使用加密的Unicode,即
ENCRYPTBYKEY(KEY\u GUID('MyKey'),N'Hello World')
ENCRYPTBYKEY(KEY\u GUID('MyKey'),'Hello World')
必须解密为
CONVERT(VARCHAR(150),DECRYPTBYKEY(Name))
。ANSI输入必须转换为ANSI输出(即
VARCHAR
)。要输出Unicode,应使用加密的Unicode,即ENCRYPTBYKEY(KEY_GUID('MyKey'),N'Hello World')
<property name="Name" column="Name" formula="CONVERT(NVARCHAR(150), DECRYPTBYKEY(Name))" />
UPDATE Company 
  SET Name = ENCRYPTBYKEY(KEY_GUID('MyKey'), 'Hello World')
  WHERE Id=1000;