我正在使用以下Scaler值函数来解密使用对称密钥加密的数据:
USE [DBNAME]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[DECRYPTDATA]
(
@CipherText NVARCHAR(MAX)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
DECLARE @Result NVARCHAR(MAX)
SELECT @Result = CONVERT(VARCHAR(MAX),DECRYPTBYKEY(@CipherText))
RETURN @Result
END
我正在使用以下查询来获取数据:
EXEC [dbo].OpenKeys
SELECT ([dbo].DECRYPTDATA([Value])) AS VALUE FROM [Table1] WHERE [UsrId] =2 AND [GroupID] = 44
我在SQL Server 2012 Management Studio中执行了此查询,它只显示解密文本的第一个字母:
当我在C#代码中检查DataTable
时,它显示了字符之间的空格:
实际数据必须如下:
╔═══════╗
║ VALUE ║
╠═══════╣
║ 232 ║
║ hgjhg ║
║ 12 ║
║ 53 ║
║ 0 ║
╚═══════╝
这里发生了什么?
更新
我尝试直接插入INSERT INTO Table1([Value]) VALUES([dbo].ENCRYPTISDATA('432'))
,但是当我获取此行时,它仅显示4
。所以我认为问题出在SQL Server端。它是什么我不知道。希望有人能尽快弄明白。我必须在几天内提交这个项目。
我使用的是TripleDES算法。
答案 0 :(得分:1)
这里似乎有几件事情在发挥作用:
decryptbykey
采用varbinary,而不是nvarchar。我猜这里有一些不必要的转换。答案 1 :(得分:0)
无论此问题的根本原因如何,如果您的原始数据在字符之间不包含空格,那么您可以应用以下快速修复:strWithSpaces=strWithSpaces.Replace(" ", String.Empty);
关于原因:加密前的原始字符串可能包含一些不可打印(即不可见)的字符,这些字符会被编码。我建议在加密前分析原始数据,并使用类似的技术在该阶段删除不必要的chars
。
希望这可能会有所帮助。