SQL Server中的数据混淆


43

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

我们想在我们的UAT系统中使用掩盖的Production数据。

如果我们想快速进行并且混淆程度更高,应该采取什么方法?我正在考虑为人们的姓氏和姓争夺角色,但是如何呢?我应该自己创建一个函数还是可以使用任何预定义的函数?我不想花时间重新发明轮子:)

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

Answers:


25

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

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

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

至于数据加扰:存在许多为您执行此操作的应用程序,说实话,您不想重新发明轮子是正确的。我们公司使用的是Net2000公司的Data Masker产品。该许可证非常便宜,它运行非常快,您不必担心在加扰数据库之前必须禁用所有约束。

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

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

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


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

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

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

10

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

---------------------
-- 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

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

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

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

7

我必须对我的客户零售数据进行此操作。对于名字,我去了人口普查,并下载了所有的名字和姓氏,将它们遍历一个循环以将每个名字和姓氏连接起来,添加性别代码并将其以大写形式加载到表中。然后,我有了一张约有4亿个唯一名称的表。我使用大写字母,因为我们当前的数据不是大写字母,所以我可以更容易地分辨出已整理的数据。

当我清理用户数据时,我换掉了名字,在生日那天,我把所有人推迟到他们实际出生的那一年的1月1日,并用邮政编码更新了所有电话号码(我的数据仅适用于美国)。电子邮件地址成为首字母加上姓氏@ mycompany.co。邮寄地址让我感到最难过,但我保留了城市,州和邮编,因为我相信如果更改地址,它们不会成为问题。我有一个同事,他的某个程序会产生乱码,并以此来更新地址行。

在我有重复数据的任何地方,但仍然对主要用户有FK(错误的设计,是的,但不是我的)。我也更新了该数据,因此名称在用户x的整个数据库中是一致的。

总体而言,尽管地址没有任何意义,但我的数据仍然可读性强。我花了几天的时间才能完成所有这些工作,但是一旦完成并创建了SQL代理作业,我可以在短短15分钟内清理数据。


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

0

为了混淆单个字段,如何使用HASHBYTES函数(在SQL 2008+中)?如果您对数据加盐,则可以选择算法(MD5可能就足够了)。因此,SELECT HASHBYTES('SHA2_256', <LAST NAME FIELD>) 您不仅 要确保自己做了SELECT HASHBYTES('SHA2_256', <LAST NAME FIELD> + '<my salt string>'),现在还拥有一个不能轻易强行强制使用的哈希。

这是一个实际的功能,可支持,可重复且可能更快。根据您真正需要保护多少安全性还是仅进行混淆,还可以使用更弱,更快的哈希。


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

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

-1

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

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

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


2
仅链接答案不是很有帮助。您可以通过给出如何使用cmdlet等例子提高你的答案
埃里克·达林
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.