【发布时间】:2015-06-10 19:45:37
【问题描述】:
我正在使用以下 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 算法。
【问题讨论】:
-
这可能是也可能不是问题,但你的函数对我来说有一些代码味道。 1)
decryptbykey将 varbinary 作为密文,而不是 nvarchar。 2)您正在转换为 varchar 但返回 nvarchar。原始明文是什么数据类型?至于您的最新评论,请尝试使用原始的encryptbykey调用或发布您的 ENCRYPTISDATA 函数的代码。 -
我同意@BenThul。请提供更多详细信息。最好的问候,
-
非常感谢@BenThul。您的提示帮助我追踪了问题的原因。我检查了加密和解密之前调用的所有存储过程和函数。我发现你的两种可能性都是真的。在某个地方我忘记转换为
varbinary,而在另一个地方我将解密结果存储在nvarchar中。我将所有内容都更改为nvarchar(因为它比varchar更好)并且它起作用了。非常感谢。如果您愿意,可以将其添加为您的答案。我会标记它。 :)
标签: c# asp.net sql-server sql-server-2012 encryption-symmetric