我希望使用Server数据库中的模糊 (扰码)敏感数据,但其方式将提供:
示例:
Abc -> zyx (lenght: 3)
StackOverflow -> a65vr4doqjd (lenght: 11)通常我不使用“国产”算法,所以你知道有一些MS内置解决方案可以提供这种混淆吗?
我希望我清楚地表达了我的问题,否则让我知道,我将尽量增加更多的信息需要。
发布于 2016-07-04 15:07:23
不,我不知道任何内置功能都能做到这一点。但是,你仍然可以做到这一点,而不必做任何太复杂的事情。
您可以使用内置的地窖_吉恩_随机性函数(在Server 2008 R2中引入),它根据提供的长度生成随机值。输出以十六进制/二进制值表示,因此返回的每个字节都表示为两个字母数字字符(因此下面是/ 2 + 1部分)。
DECLARE @InputString NVARCHAR(4000) = 'hello';
SELECT SUBSTRING(CONVERT(VARCHAR(8000),
CRYPT_GEN_RANDOM((LEN(@InputString) / 2) + 1),
2),
1,
LEN(@InputString)) AS [Obfuscated];
SET @InputString = 'test';
SELECT SUBSTRING(CONVERT(VARCHAR(8000),
CRYPT_GEN_RANDOM((LEN(@InputString) / 2) + 1),
2),
1,
LEN(@InputString)) AS [Obfuscated];返回大致如下的内容:
8C108
9A7A这里唯一的缺点是,这需要内联完成,因为CRYPT_GEN_RANDOM不能用于用户定义的函数(UDF:标量或表值)。但是,它仍然可以使用如下所示的基于集合的方法(只需将@MaxLength设置为被混淆的列的最大长度):
DECLARE @MaxLength INT = 10;
;WITH cte AS
(
SELECT CONVERT(VARCHAR(8000),
CRYPT_GEN_RANDOM((@MaxLength / 2) + 1),
2) AS [Random]
)
SELECT tmp.[String],
cte.[Random],
SUBSTRING(cte.[Random], 1, LEN(tmp.[String])) AS [Obfuscated]
FROM (VALUES (N'test'), (N'Hello')) tmp(String)
CROSS JOIN cte;返回大致如下的内容:
String Random Obfuscated
------ ------------ ----------
test F99B3888F993 F99B
Hello D3250E74F0A3 D3250如您所见,CRYPT_GEN_RANDOM为每一行返回一个不同的值。
另外,也不确定这是否可以接受,但返回的唯一alpha字符是A - F。
或者,如果您希望对相同的输入值重复混淆,或者至少不介意它是可重复的,并且希望这段代码位于一个函数中,以便更容易地应用于多个列,那么您可以使用哈希泰斯函数,它像CRYPT_GEN_RANDOM一样返回十六进制/二进制字节。与CRYPT_GEN_RANDOM不同,输出长度是固定的(在本例中是64个字符,因为我使用的是SHA2_256),所以如果输入字符串的长度大于64个字符,则使用REPLICATE重复哈希值。与CRYPT_GEN_RANDOM不同,HASHBYTES也可以用于用户定义的函数(UDF) :-)。
CREATE FUNCTION dbo.Obfuscate(@InputString NVARCHAR(4000))
RETURNS TABLE
WITH SCHEMABINDING
AS RETURN
SELECT SUBSTRING(REPLICATE(CONVERT(VARCHAR(8000),
HASHBYTES('SHA2_256', @InputString),
2),
(LEN(@InputString) / 64) + 1),
1,
LEN(@InputString)) AS [Obfuscated];
GO这可以用于以下方面:
SELECT tmp.[String],
LEN(tmp.[String]) AS [InputLength],
ob.[Obfuscated],
LEN(ob.[Obfuscated]) AS [OutputLength]
FROM (VALUES (N'test'), (N'Hello'), (REPLICATE(N'A', 63)),
(REPLICATE(N'B', 64)), (REPLICATE(N'C', 65)),
(REPLICATE(N'D', 4000))) tmp(String)
CROSS APPLY dbo.Obfuscate(tmp.[String]) ob;返回大致如下的内容:
String InputLength Obfuscated OutputLength
------ ----------- ---------- ------------
test 4 FE52 4
Hello 5 A07E4 5
AAAAAAAAAAAAAAAAAAAAAA... 63 4B589C85DE74E76487730F3... 63
BBBBBBBBBBBBBBBBBBBBBB... 64 79813FB6480F354F1C6017A... 64
CCCCCCCCCCCCCCCCCCCCCC... 65 FB4B38FBA41ECC24B5B0F68... 65
DDDDDDDDDDDDDDDDDDDDDD... 4000 5D01CC6508C164E652B5C77... 4000请注意:如果您需要A - F以外的alpha字符和/或需要为不同的输入值设置不同的模糊值(即减少冲突的机会),那么上述两种方法都可以很容易地进行调整。
https://dba.stackexchange.com/questions/142914
复制相似问题