我有一个名为表employees
与3列: FirstName
, LastName
和SSN
。
数据由一个.net服务送入该表夜间,东西我不舒服更新。
我想有一个触发器,它说:
嘿,我看到你试图插入在SSN列的东西...让我们HASH之前它去英寸
我有一个名为表employees
与3列: FirstName
, LastName
和SSN
。
数据由一个.net服务送入该表夜间,东西我不舒服更新。
我想有一个触发器,它说:
嘿,我看到你试图插入在SSN列的东西...让我们HASH之前它去英寸
一种方法是改用一个触发:
CREATE TRIGGER dbo.HashSSN
ON dbo.tablename
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON;
INSERT dbo.tablename(FirstName, LastName, SSN)
SELECT FirstName, LastName, HASHBYTES('SHA1', SSN)
FROM inserted;
END
GO
另一种方法是不插入到最后的表,但使用临时表。 临时表是一种不具有约束永久临时表,允许NULL
S,是在模式如import
和仅仅是用于外部数据源来丢弃数据到容器中。 这个概念是然后,通过适当的业务逻辑业务过程可以被设置成在所述容器中的数据进行操作。
这是一种“数据清理”层,其中SSN散列可以做的,以及其他业务流程的操作或业务规则被强制执行,如为空或不允许遗漏,大小写,长度,命名,删除重复键查找,变化通知等,最后执行插入。 的好处是,一组坏数据而不是已经试图插入,被强制回滚,然后,可以被检测到,而不会损失保存完好,并最终被正确地处理(如被移动炸毁原工艺到一个错误队列,发送通知,等)。
很多人会使用SSIS对于这样的任务,但我个人觉得SSIS很辛苦的工作,因为它有问题,从脆性,使用含临时表,部署难题,不是数据库备份,以及其他的部分SP的难度。
如果这样的方案似乎是矫枉过正你,让你甚至不考虑它,退一步一秒钟,想一想:你有被认为是正确的插入,准确,擦洗外部的过程,当然,已知数据插入表中。 但是,它没有这样做。 相反,它是将不符合业务规则的数据。 我认为,拍打在触发可能是处理它的方式,但是这也是你更多地考虑了系统的体系结构,并探讨为什么你有摆在首位这一问题的机会。
您如何看待不可信或者非业务规则兼容的数据应该成为值得信赖和符合业务规则? 在哪里改造任务,例如散列的SSN列属于?
如果在插入过程中意识到这样的业务规则? 如果是这样,这是整个组织,架构,流程,插入器的类型是否一致? 如果没有,你将如何解决这个问题。要继续你不把补丁修复上对kluges?
此外,我想点别的东西了。 只有大约8.89亿的核潜艇可能(888931098),如果没有的TIN。 你认为多久它会采取通过他们都跑散比起那些在你的餐桌? 散列当然会减少快速曝光 - 你不能只是读出SSN极易。 但考虑到只需要一个十亿的尝试,这是几天甚至几个小时弹出所有的人,这取决于资源和规划的问题。
所有的核攻击潜艇和他们的SHA1哈希彩虹表将只需要25-30 GB数量级 - 相当甚至达到一种相对廉价的家用电脑,在那里曾经创造,将允许在一瞬间突然出现的任何SSN第二上。 即便使用更长或更耗费计算哈希没有什么帮助。 在几天或几周的事彩虹表可以建。 几百块钱可以买到时下存储数TB。
你可以盐SSN哈希,这将意味着,如果有人对运行你的表蛮力破解,他们将不得不为每一行做一次,而不是能够立刻获得所有行。 这当然是越多越好,但它只是推迟了必然。 一个严重的黑客很可能有一个机器人军队支持他,可以在几秒钟之内破解一个简单的SSN +盐。
我有兴趣在开始要求你能够验证核潜艇,并利用它们作为一种密码的一方面是业务规则,但另一方面不能让您存储的全部价值。 你有你的数据库的安全问题? 现在你已经更新了你的问题说,这些是员工,我为什么非SSN-持有人的排斥是没有实际意义的问题。 不过,我还是好奇,为什么你需要哈希值,并不能只保存。 这不只是罚款,但有其雇员的社会安全号码,因此它可以报告收入和扣除向政府要求雇主。
如果在另一方面,你担心的是不是真正的安全性,但更多的不可否认性(“您的SSN不会存储在我们的服务器上!”),那么这是不是真的,现在,是什么呢? 你所做的一切是可以通过蛮力被逆转的方式改变它,搜索空间是足够小,蛮力是比较合理的。 如果有人给你数42,你乘以2并保存84,然后告诉并非存储在他的数人,但你可以简单地划分84 2就得到原来的号码,那么你就没有真正被完全明了。
当然,“单向”散列是更难比乘以扭转,但我们不与处理问题,如“找到原来的20万个字符的文件(或其他)从它的哈希”,而是“找一个9位数从它的哈希”号。 当然,许多不同的投入将散列为一个特定的SSN相同的价值观,但我怀疑,恰好有由数字组成专门9字符串的很多冲突。
我只是做了一些测试。 我有一个在它约3200真正的核潜艇的表。 我散列他们使用SHA1和把这些哈希到只包含一列的临时表。 我能够在约8分钟向上搜索到弹出核潜艇1% 001-01-0001
。 基于处理的速度和总的搜索空间将在不到3个小时来完成(它是10米万元左右的核潜艇,所以88.89 *2分钟服用〜2分钟)。 这是从SQL Server 中 ,没有运行编译的程序,可能是多,快多了。 这是不是很安全!