我们有一个数据库,其中包含一些加密列(此处描述的对称密钥)。我正在尝试使用老式 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 不返回任何内容,它是一个 void 语句。
有什么方法可以让 NHibernate 在其他地方调用 Open 吗?也许只是在打开连接之后或在某处的会话处理中?
否则,是否有有效的 SQL 语法让该语句在查询中工作?
视图、函数和存储过程不是一种选择,因为它们违背了加密列的目的。
- - 编辑 - -
打开会话时执行 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))
,我得到了一些有趣的字符'效汬潗汲d'而不是'Hello World'。
我想升级我们的 SQL2005 数据库并使用Remus Rusanu提到的 TDE 是最好的选择。