C# SQL Server加密和nhibernate
我们有一个数据库,它有几个加密列(如所述的对称密钥)。我正试图使用老式的NHybernate 2.1.2.4在一个遗留应用程序中映射这些表 我想我可以使用公式映射加密列,如下所示: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
<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;