我正在使用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"])
};
由于
答案 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()
的结果。