use*_*792 2 sql sql-server encryption user-defined-functions
我有一个屏蔽/加密函数,它循环遍历字符串的每个字符并用表中的值替换它。表格示例
Position    OriginalValue   MaskedValue
1           a               t
1           b               @
2           a               r
Run Code Online (Sandbox Code Playgroud)
我的功能适用于小集合,但真正的大表需要很长时间。有没有更好的方法来编写这个函数?
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
Run Code Online (Sandbox Code Playgroud)
    您应该废弃此方法,转而考虑使用几个成对ENCRYPTBY/DECRYPTBY内置函数之一:
编辑:
对于不需要解密的情况(即无法转换回原始值的单向转换),例如通常如何处理密码,您可以使用HASHBYTES函数,它可以执行以下算法:
SQL Server 2005 及更新版本可以执行以下操作:
SQL Server 2012(和更新版本)添加了这些:
上面提到的所有函数(HASHBYTES和ENCRYPTBY_____)都返回一个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;
Run Code Online (Sandbox Code Playgroud)