SQL Server中数据混淆的最佳实践是什么?

我们想在UAT系统中使用带掩码的Production数据。如果混淆程度更高,应该采取什么方法?我正在考虑为人物的名字和姓氏争夺角色,但是如何呢?我应该自己创建一个函数还是可以使用任何预定义的函数?我不想花时间重新发明轮子:)

日期字段呢?例如,应该从整个表中随机选择出生日期并分配给记录,还是有更好的方法呢?

#1 楼

我希望我能为此加点100分!我已经看到这个主题被忽视了很多次,这是不正确的-做得很好。据我了解,您实际上想对字段本身中的数据进行加扰,尽管我了解您要实现的目标,但这样做不一定是必要的,尽管应该逐案考虑。

大多数数据保护法律都围绕着将数据正确地与个人相关联的能力(例如出生日期或电话号码)。您可以通过确保将数据从生产中移出UAT时将其弄乱,从而不容易将其重新映射到原始人,从而满足法律的要求-尤其是当您混淆姓氏和姓氏时。

但是,这不能解决问题,比如说联系方式。您可以通过整理数据来满足法律的要求,但是电话号码仍然是真实的,电子邮件仍然是真实的,等等……它们只是没有分配给正确的人。为此,我建议尽可能在将数据传递到UAT之前清除该数据,Red Gate会执行一个名为“数据生成器”的软件,该软件可以为您创建随机测试数据,以便您可以使用可以进行测试的数据重新填充字段。

关于数据加扰:有许多应用程序可以为您做到这一点,老实说,您不想重新发明轮子是正确的。我们公司使用的是Net2000公司的Data Masker产品。该许可证非常便宜,它的运行速度非常快,您不必担心在加扰数据库之前必须禁用所有约束。

如果您找不到符合您要求的任何内容,那么您当然可以推出自己的解决方案-如果您决定这样做,我强烈建议您使用CLR过程进行此操作,因为它比纯TSQL更灵活(不是说您无法使用TSQL,请参见此处。)

一旦您选择了一个应用程序来为您执行此操作,接下来您需要确定的是您实际上想要/需要进行哪些操作?老实说,您最好的资源是公司法律团队和/或公司审计师。我知道有时候我们可能不喜欢与他们合作,但是他们会比您更好地与他们联系并向他们提出问题,而不是尝试自己动手做错事情,寻求帮助绝对没有错。 -尤其重要的是。

我希望这对您有所帮助,也祝您好运……;-)

评论


如果可以的话,我会再提一个提及公司政策的支持。

– dezso
2012年9月6日上午8:08

法律要求由利益相关者确定。我现在应该实施它。

–天空
2012年9月6日在21:13

布朗斯通先生,您的解释一如既往。谢谢。我将为此检查CLR函数,并同时关注T-SQL。看看哪个更适合并且构建更快。

–天空
2012年9月6日在21:29

#2 楼

布朗斯通先生将指甲砸在了头上。现在为您提供一些帮助,这是我的“乱码”功能,用于混淆字符串(带有名称的有趣结果!)。传递一个字符串,它返回一个乱码。将其包括在针对字符串列的更新语句中。根据需要更改数据长度。

---------------------
-- Garble Function --
---------------------
-- Make a function to slightly garble the strings
IF (object_id('fn_Garble') is not null)
  drop function fn_Garble
go
create function fn_Garble
(
  @String varchar(255)
)  
returns varchar(255)
as
BEGIN
  select @String = replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(@String,'o','e'),'a','o'),'i','a'),'u','i'),'t','p'),'c','k'),'d','th'),'ee','e'),'oo','or'),'ll','ski')
  return @String
END
go


评论


听起来很熟悉? (这只是您的观点的例证。)SQL Server是一种高级的软件。在Kekkang Waph SQL上安装了Meprepelas和Meprepelas。我们普遍使用pravope sekper ergonazopaens的thopobose kensilponps pevoraeis piblak。 SQL Server Mogozane上的其他语言,以及通过p-SQL 101序列或e-bek进行的安装。这是SQL Server的一个不错的选择,两者都是SQL 4.2。

– dezso
2012年9月6日13:52



嘿...花了我一段时间才能认出它。那里似乎有很多非乱码。我只将它用于名字,姓氏,城市名称。只是一个愚蠢的小功能。我不会把我的职业放在这上面。

– datagod
2012年9月6日14:44

我赞赏这种方法-保持简单但有效。还有一点是,案文仍然清晰可辨。我虽然不明白:)

– dezso
2012年9月6日18:49

#3 楼

我必须对我的客户零售数据进行此操作。对于名字,我去了人口普查,并下载了所有的名字和姓氏,将它们遍历一个循环以将每个名字和姓氏连接起来,添加性别代码并将其以大写形式加载到表中。然后,我有了一张约有4亿个唯一名称的表。我使用大写字母,因为我们当前的数据不是大写字母,所以我可以更容易地分辨出被擦除的数据。他们实际上是在当年1月1日出生,并使用邮政编码更新了所有电话号码(我的数据仅适用于美国)。电子邮件地址成为首字母加上姓氏@ mycompany.co。邮寄地址给了我最大的痛苦,但我保留了城市,州和邮编,因为我相信如果更改地址,它们不会成为问题。我有一个同事,他的某个程序会产生乱码,并以此来更新地址行。

在任何地方我都有重复的数据,但仍然对主要用户有FK(错误的设计,是的,但不是我的)。我也更新了该数据,因此名称在用户x的整个数据库中是一致的。 />
尽管地址没有任何意义,但总体来说我的数据仍然可读性强。我花了几天的时间才能完成所有这些工作,但是一旦完成并创建了SQL代理作业,我可以在短短15分钟内清理数据。

评论


我喜欢你的方法。关于名字和姓氏,我认为如果数据集足够大且变化程度很好,我们可以将其用作来源,而不必从人口普查网站下载名字。通过SELECT DISTICT查询数据将告诉我们许多必须使用的独特价值。

–天空
2012年9月6日在21:47

#4 楼

为了混淆单个字段,如何使用HASHBYTES函数(在SQL 2008+中)?如果您对数据加盐,则可以选择算法(MD5可能就足够了)。因此,请确保您执行的是SELECT HASHBYTES('SHA2_256', <LAST NAME FIELD>),而不仅仅是
SELECT HASHBYTES('SHA2_256', <LAST NAME FIELD> + '<my salt string>')
,现在您有了一个不能轻易强行强制使用的哈希值。 ,而且可能要快得多。根据您真正需要保护的安全程度还是仅仅进行混淆,还可以使用更弱,更快速的哈希。

评论


在这个时代,您不应该使用MD5,因为它本质上是不安全的。

–Philᵀᴹ
16年1月26日在20:32

OK ...使用HASHBYTES:MD2 |这里有您的选择MD4 | MD5 | SHA | SHA1 | SHA2_256 | SHA2_512适合所有人的东西! (包括,是的,您不应该使用的)。那么说我们正在使用SHA2_512 ...这种方法还有其他问题吗?

–cmcapellan
16 Jan 27'2:38



#5 楼

看一下Chrissy Lemaire(@ chrissy-lemaire)和她的团队编写的dbatools PowerShell模块,该模块提供了静态数据屏蔽的免费选项。他们所有的工具都很出色,所以我相信这值得一看。

在dbatools中查找的两个命令是:
New-DbaDbMaskingConfig
Invoke-DbaDbDataMasking

请看一下宣布此的博客文章:自动数据屏蔽

评论


仅链接答案不是很有帮助。您可以通过举例说明如何使用cmdlet等来改善答案。

–埃里克·达林(Erik Darling)
18/12/27在21:29