【发布时间】:2012-01-06 14:52:08
【问题描述】:
我们有一个应用程序正在使用informix ENCRYPT_TDES 函数。我发现 SQL SERVER 有一个名为 ENCRYPTBYPASSPHRASE 的函数,它也使用 TDES。然而,结果却大不相同。 SQL SERVER 一个返回一个 varbinary,而 Informix 一个返回一个 BASE64 字符串。
这是 Informix 语句的一个示例:
SELECT encrypt_tdes('12345CF','thepassword') from sometable
结果示例:
18A//AAAACA150blzB2/uXYO8vtaqBZpg==
这是我对 SQL SERVER 2008 所做的(但与 Informix 解密不兼容,反之亦然):
DECLARE @bin AS VARBINARY(256)
SET @bin = ENCRYPTBYPASSPHRASE('thisisthepassword', '12345CF')
select CAST(N'' AS XML)
.value('xs:base64Binary(xs:hexBinary(sql:variable("@bin")))', 'VARCHAR(MAX)')
结果示例:
AQAAAOVcL3PwM28dUENp1JF845auaRH9loIrDA==
我假设我的问题可能在于编码。但是,我似乎无法解决这个问题。如果无法通过内置的 MS SQL 函数实现,那么你们中的任何人都知道可以加密并返回与 Informix 兼容的字符串的 VB.NET 代码,因此我可以添加一个 .NET dll 并在我的 MS SQL 查询中使用它。
感谢您的帮助!
编辑:谁能帮我找到一种将 Informix ENCRYPT_TDES 函数模仿成 C# 或 VB.NET 的方法?
【问题讨论】:
-
仅供参考 这可能是因为两个平台都采用密码短语,然后从中派生一个适当大小的密钥,然后用于加密数据;不同的推导方法=不同的密钥=不同的密文。文档指出 encrypt_tdes 使用密码短语的 sha1 散列,而 mssql 使用 cryptoapi 派生密钥,该密钥具有比简单散列更复杂的方法。
-
谢谢,那很有道理。您是否偶然知道我如何在 C# 或 VB.NET 中复制 Informix?我一直在谷歌上搜索它。我可以在 SQL 中使用 .NET 程序集来做到这一点。它不是一个使用频率很高的函数,仅用于单次选择,因此使用 .NET 程序集就可以了。
-
不知道我害怕,将 C# 标签添加到您的问题中
-
好主意。感谢您的洞察力。你帮我指明了正确的方向。
标签: c# .net sql-server encryption informix