TSQL - decryptbypassphrase:字符串中的噪声

本文关键字:噪声 字符串 decryptbypassphrase TSQL | 更新日期: 2023-09-27 18:17:26

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

它工作得很好,但是decryptbypassphrase正在为我的数据添加一些"噪音",如"'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"])
};

谢谢

TSQL - decryptbypassphrase:字符串中的噪声

是的,先生,我使用varchar对他们两个(尝试nvarchar,但解密的文本是"奇怪"的㈱㐳㘵㠷)。

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

CONTEXT_INFO可能是罪魁祸首——它默默地在数据右填充0,因此当您读回它时,数据将与您最初打算存储的数据不同。

例如:

SET CONTEXT_INFO 0x12;
PRINT CONTEXT_INFO();

打印:

0x1200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

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

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