【问题标题】:Symmetric Key Decryption returning values with space between characters对称密钥解密返回字符之间有空格的值
【发布时间】: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


【解决方案1】:

这里似乎有几件事在起作用:

  1. decryptbykey 采用 varbinary,而不是 nvarchar。我猜想那里正在进行一些不需要的转换。
  2. 您将解密结果转换为 varchar,但从您的函数返回为 nvarchar。又是不必要的转换。

【讨论】:

    【解决方案2】:

    不管这个问题的根本原因是什么,如果您的原始数据不包含字符之间的空格,那么您可以应用快速修复,例如:strWithSpaces=strWithSpaces.Replace(" ", String.Empty);

    关于原因:加密之前的原始字符串可能包含一些不可打印(即不可见)的字符,这些字符已被编码。我建议在加密之前分析原始数据,并在该阶段使用类似的技术删除不必要的chars

    希望这会有所帮助。

    【讨论】:

    • 它可能包含空格,因为它存储字符串值,并且它们可以是用户的全名或地址,可以包含空格。
    • 我已经扩展了答案。请在编码之前运行测试并包含原始数据样本。最好的问候,
    • 我尝试像INSERT INTO Table1([Value]) VALUES([dbo].ENCRYPTISDATA('432')) 一样直接插入,但是当我获取这一行时,它只显示4
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 2021-08-27
    • 2012-08-30
    • 1970-01-01
    相关资源
    最近更新 更多