TSQL:是否有更快或更好的方法来加密值?
TSQL: Is there a faster or better way to encrypt values?
我有一个 masking/encryption 函数,它循环遍历字符串的每个字符并将其替换为 table 中的值。 table
的示例
Position OriginalValue MaskedValue
1 a t
1 b @
2 a r
我的函数适用于小集,但真正大的 table 需要很长时间。这个函数有没有更好的写法?
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
您应该放弃此方法,转而考虑使用几个成对的 ENCRYPTBY
/ DECRYPTBY
内置函数之一:
编辑:
对于不需要解密的情况(即单向变换不能变回原值),比如密码通常是如何处理的,可以使用HASHBYTES函数,它可以做如下算法:
SQL Server 2005 及更新版本可以做到:
- MD2
- MD4
- MD5
- SHA
- SHA1
SQL Server 2012(及更新版本)添加了这些:
- SHA2_256
- SHA2_512
上面提到的所有函数(HASHBYTES
和 ENCRYPTBY_____
)return a VARBINARY
。如果您需要字符串格式的十六进制数字,CONVERT 函数从 SQL Server 2008 开始,添加了 "style" 数字 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;
我有一个 masking/encryption 函数,它循环遍历字符串的每个字符并将其替换为 table 中的值。 table
的示例Position OriginalValue MaskedValue
1 a t
1 b @
2 a r
我的函数适用于小集,但真正大的 table 需要很长时间。这个函数有没有更好的写法?
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
您应该放弃此方法,转而考虑使用几个成对的 ENCRYPTBY
/ DECRYPTBY
内置函数之一:
编辑:
对于不需要解密的情况(即单向变换不能变回原值),比如密码通常是如何处理的,可以使用HASHBYTES函数,它可以做如下算法:
SQL Server 2005 及更新版本可以做到:
- MD2
- MD4
- MD5
- SHA
- SHA1
SQL Server 2012(及更新版本)添加了这些:
- SHA2_256
- SHA2_512
上面提到的所有函数(HASHBYTES
和 ENCRYPTBY_____
)return a VARBINARY
。如果您需要字符串格式的十六进制数字,CONVERT 函数从 SQL Server 2008 开始,添加了 "style" 数字 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;