sql - TSQL : Is there a faster or better way to encrypt values?

标签 sql sql-server encryption user-defined-functions

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

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

最佳答案

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

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

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

  • MD2
  • MD4
  • MD5
  • 上海
  • SHA1

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

  • SHA2_256
  • SHA2_512

上面提到的所有函数(HASHBYTESENCRYPTBY_____ )都返回一个 VARBINARY。如果你需要那些字符串格式的十六进制数字,CONVERT函数,从 SQL Server 2008 开始,添加了“样式”数字 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;

关于sql - TSQL : Is there a faster or better way to encrypt values?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27847156/

相关文章:

iOS加密使用DER格式的RSA公钥文件

sql - 一对多表确保两个表都来自链上的同一父表

sql-server - SQL Server 时态表的 SSDT 代码分析错误

sql - 设计问题 - 在列、行或其他位置放置数百个是/否开关?

java - 密码/3DES/CFB/Java 和 PHP

用户数据的 PHP、MySQL 和 AES 加密/解密

sql - 两个sql查询之间的减法

mysql - 如何将两个选择结果合并为列

sql - 执行 SUM 聚合操作时使用通配符的 Big Query 出错

c# - 比较两个平面文件内容的最佳方法