TSQL:是不是有更快或更好的加密值的方法?

Posted

技术标签:

【中文标题】TSQL:是不是有更快或更好的加密值的方法?【英文标题】:TSQL: Is there a faster or better way to encrypt values?TSQL:是否有更快或更好的加密值的方法? 【发布时间】:2015-01-08 18:33:37 【问题描述】:

我有一个屏蔽/加密函数,它遍历字符串的每个字符并将其替换为表中的值。表格示例

Position    OriginalValue   MaskedValue
1           a               t
1           b               @
2           a               r

我的功能适用于小型集合,但非常大的表需要很长时间。有没有更好的方法来编写这个函数?

CREATE  FUNCTION [dbo].[fn_SSNMask] (@string VARCHAR(100))  
  RETURNS VARCHAR(100) 
AS  

BEGIN 
DECLARE @Mask AS VARCHAR(100)
SET @Mask= ''

DECLARE @Char AS CHAR(1)
DECLARE @Counter AS INT=1
DECLARE @CharReplace AS CHAR(1)

WHILE @Counter <= (select len(@string))
BEGIN
    SET @Char=SUBSTRING(@string,@Counter,1)
    SELECT @CharReplace =maskedvalue FROM dbo.Mask WHERE Position=@Counter AND originalvalue=@Char

    SET @Mask=@Mask+ ISNULL(@CharReplace,@Char)

    SET @Counter=@Counter + 1
    SET @Char=NULL
    SET @CharReplace=NULL
END

RETURN (@Mask)

END

【问题讨论】:

用正则表达式替换应该会更快,所以c#或python可以做得更好。如果你可以定义CLR函数,那么你可以在SQL Server中使用它,这样会更快。 CLR 在我的环境中不是一个选项。 你的函数叫做 SSNMask。您正在实施Ceasar Cipher 到什么目的?它是可逆的,可能会愚弄一个 3 岁的孩子,但极不可能保护数据不被任何有一点智慧的人窃取 为什么方法效率低?您正在枚举 @string 参数中的每个字符,可能是 100 个字符。对于其中的每一个,您都在对 Mask 表进行查找,然后构建一个新字符串并返回它。然后,您为传入的每一行执行该任务。如果提供的 SSN 是 111-11-1111,您将执行 11 次相同的查找,并且只生成 2 个唯一值。 【参考方案1】:

您应该放弃此方法,而是考虑使用几个配对的 ENCRYPTBY / DECRYPTBY 内置函数之一:

ENCRYPTBYASYMKEY/DECRYPTBYASYMKEY

ENCRYPTBYCERT/DECRYPTBYCERT

ENCRYPTBYKEY / DECRYPTBYKEY

ENCRYPTBYPASSPHRASE / DECRYPTBYPASSPHRASE

编辑: 对于不需要解密的情况(即无法转换回原始值的单向转换),例如通常如何处理密码,您可以使用HASHBYTES函数,该函数可以执行以下算法:

SQL Server 2005 及更新版本可以做到:

MD2 MD4 MD5 SHA SHA1

SQL Server 2012(及更高版本)添加了这些:

SHA2_256 SHA2_512

上面提到的所有函数(HASHBYTESENCRYPTBY_____)都返回一个 VARBINARY。如果您需要字符串格式的这些十六进制数字,则从 SQL Server 2008 开始,CONVERT 函数添加了“样式”数字 1 和 2 来处理此问题:

;WITH cte AS
(
  SELECT HASHBYTES('SHA2_512', N'test') AS [HashedValue]
)
SELECT cte.HashedValue, -- VARBINARY
       CONVERT(VARCHAR(200), cte.HashedValue) AS [DefaultOrStyle0], -- converted
       CONVERT(VARCHAR(200), cte.HashedValue, 1) AS [Style1], -- leading 0x
       CONVERT(VARCHAR(200), cte.HashedValue, 2) AS [Style2] -- no leading 0x
FROM   cte;

【讨论】:

非常感谢

以上是关于TSQL:是不是有更快或更好的加密值的方法?的主要内容,如果未能解决你的问题,请参考以下文章

除了DES,AES,还有哪更强的加密算法吗?哪个更好些?

带有未加密值的 PayPal HTML 表单基础知识

使用 mcrypt 加密敏感数据

如何检查是不是有人尝试共享您的程序

Android 的几种加密方式

TSQL查找组中的所有记录是不是具有相同的值