TSQL - decryptbypassphrase:字符串中的噪声

时间:2013-06-07 09:51:40

标签: c# sql-server-2008 tsql encryption encoding

我正在使用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"])
};

由于

2 个答案:

答案 0 :(得分:0)

  

是的,先生,我正在为他们两个使用varchar(首先尝试nvarchar,但解密的文本是“奇怪的”,如㈱㐳㘵㠷)。

我相信这些日文字符是实际文字,因此我建议您返回NVARCHAR修复程序。 C#字符串数据类型映射到Sql NVARCHAR数据类型。

答案 1 :(得分:0)

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

例如:

SET CONTEXT_INFO 0x12;
PRINT CONTEXT_INFO();

打印:

0x1200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

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

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