首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >T中的动态长度混淆方法

T中的动态长度混淆方法
EN

Database Administration用户
提问于 2016-07-04 12:45:25
回答 1查看 1.3K关注 0票数 1

我希望使用Server数据库中的模糊 (扰码)敏感数据,但其方式将提供:

  • 不可逆性(明文不能从模糊的数据中导出),
  • 混淆数据长度需要与混淆前的数据长度相同。
  • 对于相同输入值的重复混淆,模糊值不需要是唯一的。老实说,我更喜欢为可以使用的相同输入获得相同的值(例如,不同表中的一些匹配数据,可能在测试用例中有用)。

示例:

代码语言:javascript
复制
Abc -> zyx (lenght: 3)
StackOverflow -> a65vr4doqjd (lenght: 11)

通常我不使用“国产”算法,所以你知道有一些MS内置解决方案可以提供这种混淆吗?

我希望我清楚地表达了我的问题,否则让我知道,我将尽量增加更多的信息需要。

EN

回答 1

Database Administration用户

回答已采纳

发布于 2016-07-04 15:07:23

不,我不知道任何内置功能都能做到这一点。但是,你仍然可以做到这一点,而不必做任何太复杂的事情。

您可以使用内置的地窖_吉恩_随机性函数(在Server 2008 R2中引入),它根据提供的长度生成随机值。输出以十六进制/二进制值表示,因此返回的每个字节都表示为两个字母数字字符(因此下面是/ 2 + 1部分)。

代码语言:javascript
复制
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];

返回大致如下的内容:

代码语言:javascript
复制
8C108

9A7A

这里唯一的缺点是,这需要内联完成,因为CRYPT_GEN_RANDOM不能用于用户定义的函数(UDF:标量或表值)。但是,它仍然可以使用如下所示的基于集合的方法(只需将@MaxLength设置为被混淆的列的最大长度):

代码语言:javascript
复制
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;

返回大致如下的内容:

代码语言:javascript
复制
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) :-)。

代码语言:javascript
复制
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

这可以用于以下方面:

代码语言:javascript
复制
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;

返回大致如下的内容:

代码语言:javascript
复制
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字符和/或需要为不同的输入值设置不同的模糊值(即减少冲突的机会),那么上述两种方法都可以很容易地进行调整。

票数 6
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/142914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档