对称密钥解密返回字符之间带有 space 的值
Symmetric Key Decryption returning values with space between characters
我正在使用以下 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
时,它在字符之间显示 space:
实际数据应该是这样的:
╔═══════╗
║ VALUE ║
╠═══════╣
║ 232 ║
║ hgjhg ║
║ 12 ║
║ 53 ║
║ 0 ║
╚═══════╝
这里发生了什么?
更新
我尝试像 INSERT INTO Table1([Value]) VALUES([dbo].ENCRYPTISDATA('432'))
那样直接插入,但是当我获取该行时它只显示 4
。所以我认为问题出在 SQL 服务器端。那是什么我不知道。希望有人能尽快弄清楚。过几天就要交这个项目了
我正在使用 TripleDES 算法。
不管这个问题的根本原因是什么,如果您的原始数据不包含字符之间的空格,那么您可以应用快速修复,例如:strWithSpaces=strWithSpaces.Replace(" ", String.Empty);
关于原因:加密前的原始字符串可能包含一些不可打印的(即不可见的)字符,这些字符会被编码。我建议在加密之前分析原始数据,并在那个阶段使用类似的技术删除不必要的 chars
。
希望这可能有所帮助。
这里似乎有几件事在起作用:
decryptbykey
采用 varbinary,而不是 nvarchar。我猜那里正在进行一些不需要的转换。
- 您正在将解密结果转换为 varchar,但作为 nvarchar 从您的函数返回。又一次不需要的转换。
我正在使用以下 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
时,它在字符之间显示 space:
实际数据应该是这样的:
╔═══════╗
║ VALUE ║
╠═══════╣
║ 232 ║
║ hgjhg ║
║ 12 ║
║ 53 ║
║ 0 ║
╚═══════╝
这里发生了什么?
更新
我尝试像 INSERT INTO Table1([Value]) VALUES([dbo].ENCRYPTISDATA('432'))
那样直接插入,但是当我获取该行时它只显示 4
。所以我认为问题出在 SQL 服务器端。那是什么我不知道。希望有人能尽快弄清楚。过几天就要交这个项目了
我正在使用 TripleDES 算法。
不管这个问题的根本原因是什么,如果您的原始数据不包含字符之间的空格,那么您可以应用快速修复,例如:strWithSpaces=strWithSpaces.Replace(" ", String.Empty);
关于原因:加密前的原始字符串可能包含一些不可打印的(即不可见的)字符,这些字符会被编码。我建议在加密之前分析原始数据,并在那个阶段使用类似的技术删除不必要的 chars
。
希望这可能有所帮助。
这里似乎有几件事在起作用:
decryptbykey
采用 varbinary,而不是 nvarchar。我猜那里正在进行一些不需要的转换。- 您正在将解密结果转换为 varchar,但作为 nvarchar 从您的函数返回。又一次不需要的转换。