2

我正在使用 encryptbypassphrase/decyptbypassphrase 加密/解密 SqlServer 2008 R2 数据库中的数据。

它工作正常,但解密密码短语为我的数据添加了一些“噪音”,例如“\0”。我通过正则表达式管理它。

但现在我的情况更糟,该函数返回“ýÿ:ýÿ ýÿOýÿuýÿiýÿ”而不是“:Oui”(我必须从字符串中删除ýÿ......)

我正在使用CONTEXT_INFO来存储密码,并在我的查询中检索它。存储过程:

DECLARE @PassPhrase VARCHAR(128)
EXEC [dbo].[sp_GetContextInfo]
@ContextInfo = @PassPhrase out
-- 
SELECT
ap.ActionPlanStatusId,
CONVERT(VARCHAR(MAX),DECRYPTBYPASSPHRASE(@PassPhrase,ap.Cost)) AS Cost,
CONVERT(VARCHAR(MAX),DECRYPTBYPASSPHRASE(@PassPhrase,ap.[Description])) AS [Description],
CONVERT(VARCHAR(MAX),DECRYPTBYPASSPHRASE(@PassPhrase, ap.Follow)) AS Follow,
ap.Id,
ap.ModifiedBy,
ap.ModifiedOn,
ap.RiskSheetId,
ap.TreatmentId
FROM dbo.ActionPlan ap
WHERE ap.Id = @ActionPlanId

这是代码(我使用的是简单的 DataReader):

var actionPlan = new Core.ActionPlan
{
Id = Convert.ToInt32(reader["Id"]),
ActionPlanStatusId = Convert.ToInt32(reader["ActionPlanStatusId"]),
Cost = reader["Cost"] as string,
Description = reader["Description"] as string,
Follow = reader["Follow"] as string,
RiskSheetId = Convert.ToInt32(reader["RiskSheetId"]),
TreatmentId = Convert.ToInt32(reader["TreatmentId"]),
ModifiedOn = Convert.ToDateTime(reader["ModifiedOn"])
};

谢谢

4

2 回答 2

0

是的先生,我对他们两个都使用了varchar(首先尝试了nvarchar,但解密后的文本很“奇怪”,比如㈱㐳㘵㠷)。

我相信这些日文字符是实际文本,所以我建议回到你的 NVARCHAR 修复。C# 字符串数据类型映射到 Sql NVARCHAR 数据类型。

于 2013-06-12T20:12:06.317 回答
0

CONTEXT_INFO是可能的罪魁祸首 - 它默默地用零填充数据,所以当你读回它时,数据将与你最初打算存储的数据不同。

例如:

SET CONTEXT_INFO 0x12;
PRINT CONTEXT_INFO();

印刷:

0x1200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

问题是你会得到相同的结果SET CONTEXT_INFO 0x1200。最后的零与填充无法区分!

我看到的解决这种歧义的唯一方法是以某种方式在 的第一个字节中编码数据的实际长度,SET CONTEXT_INFO然后CONTEXT_INFO()相应地解压缩结果。

于 2014-10-29T23:01:11.687 回答