gpt4 book ai didi

c# - SQL Server 加密和 nhibernate

转载 作者:行者123 更新时间:2023-11-30 20:57:30 29 4
gpt4 key购买 nike

我们有一个包含一些加密列的数据库(对称 key ,如 here 所述)。我正在尝试使用旧式 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 语句。我可以通过尝试以下操作在纯 SQL 中重现该问题:

SELECT 
Company.Id,
(OPEN SYMMETRIC KEY MyKey DECRYPTION BY CERTIFICATE MyCert
SELECT CONVERT(NVARCHAR(150), DECRYPTBYKEY(Name)) FROM [Company] WHERE Id = Company.Id),
Address
FROM Company;

这给出了同样的错误,因为 Open 不返回任何东西,它是一个无效语句。

有没有办法让 NHibernate 在其他地方调用 Open?也许只是在打开连接之后或在某个地方处理 session ?

否则,是否存在有效的 SQL 语法来使该语句在查询中起作用?

View 、函数和存储过程不是一种选择,因为它们破坏了加密列的目的。

---- 编辑----

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

<property name="Name" column="Name" formula="CONVERT(NVARCHAR(150), DECRYPTBYKEY(Name))" />

似乎解决了一半的问题,该字段是只读的:-(

顺便说一句,使用纯 SQL 更新字段也会产生疯狂的结果。当我这样做时:

UPDATE Company 
SET Name = ENCRYPTBYKEY(KEY_GUID('MyKey'), 'Hello World')
WHERE Id=1000;

然后使用 CONVERT(NVARCHAR(150), DECRYPTBYKEY(Name)) 读回,我得到了一些有趣的字符 '有效 Steam d' 而不是 'Hello World'。

我想升级我们的 SQL2005 数据库并使用 TDE 作为 Remus Rusanu提到的是最好的选择。

最佳答案

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

至于你的问题:只需在 session 中打开 key (即当你打开连接时)。尝试按语句访问按需打开它的理由为零。

关于c# - SQL Server 加密和 nhibernate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16787920/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com