我有一个名为employees
的表格,其中包含3列:FirstName
,LastName
和SSN
。
数据每晚由.Net服务提供给此表,我不习惯更新。
我想要一个触发器说:
嘿,我看到你试图在SSN专栏中插入一些东西......在它进入之前让我们把它哈希。
答案 0 :(得分:4)
一种方法是使用INSTEAD OF TRIGGER:
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
答案 1 :(得分:3)
另一种方法是不插入最终表而是使用登台表。登台表是一种永久临时表,没有约束,允许NULL
,在import
等模式中,只是外部数据源将数据放入的容器。这样的概念是,可以设置具有适当业务逻辑的业务流程来对容器中的数据进行操作。
这是一种"数据清理"可以完成SSN散列的层,以及正在执行的其他业务流程或业务规则,例如可空性或允许的省略,大小写,长度,命名,重复消除,密钥查找,更改通知等,然后最终执行插入。好处是可以检测到一组坏数据,而不是试图插入,被迫回滚,然后炸毁原始过程,保持完好无损并最终得到妥善处理(例如移动)到错误队列,发送通知等等。
很多人会使用SSIS来完成这样的任务,尽管我个人认为SSIS非常难以使用,因为它存在问题,包括脆弱性,使用包含临时表的SP的困难,部署挑战,不是数据库备份的一部分,以及其他如果这样的方案对您来说似乎有些过分,以至于您甚至不会考虑它,请退一步并考虑一下:您有一个外部进程应该插入正确,精确,擦除,并将当前已知的数据放入表中。但是,它没有这样做。相反,它会插入不符合业务规则的数据。我认为敲击触发器可能是一种处理它的方法,但这也是一个机会让你更多地考虑系统的体系结构,并探讨为什么你首先遇到这个问题。
您认为不受信任或不符合业务规则的数据应该如何变得受信任且符合业务规则?转换任务(例如散列SSN列)属于哪里?
插入过程是否应该了解此类业务规则?如果是这样,整个组织,架构,插件的进程类型是否一致?如果没有,你将如何解决这个问题,以后你还没有修补补丁?
此外,我想指出一些其他问题。如果没有TIN,那么只有大约8.89亿SSN可能(888,931,098)。您认为通过所有这些并将哈希值与表中的哈希值进行比较需要多长时间?散列肯定会减少快速曝光 - 你不能轻易地读取SSN。但考虑到只需要十亿次尝试,根据资源和规划,弹出所有这些都需要几天甚至几小时。
包含所有SSN及其SHA1哈希的彩虹表只需要25-30 GB的数量级 - 即使在相对便宜的家用计算机上也可以实现,一旦创建它就可以在一瞬间弹出任何SSN。即使使用更长或更具计算成本的哈希也不会有太大帮助。在几天或几周内,可以建造彩虹桌。现在几百美元可以购买多个TB的存储空间。
你可以对SSN哈希进行加盐,这意味着如果有人对你的桌子进行暴力破解,他们将不得不为每一行做一次,而不是能够立即获得所有行。这当然更好,但它只会延迟不可避免的事情。一个严肃的黑客可能有一个机器人军队支持他,可以在几秒钟内破解一个简单的SSN +盐。
我会对业务规则感兴趣,这些规则一方面要求您能够验证SSN并将其用作一种密码,但另一方面不允许您存储完整的值。您对数据库有安全顾虑吗?现在你已经更新了你的问题,说这些是员工,我对于为什么排除非SSN持有人的问题没有实际意义。但是,我仍然很好奇为什么你需要散列值并且不能只存储它们。它不仅很好,而且要求让雇主雇用其员工' SSN可以向政府报告收入和扣除额。
另一方面,如果你的担忧不是关于安全性,而是更多关于拒绝("你的SSN永远不会存储在我们的服务器上!")那么这不是真的是的,现在,是吗?你所做的就是以一种可以通过蛮力反转的方式改变它,搜索空间足够小,暴力非常合理。如果有人给你42号,然后你将它乘以2并保存84,那么告诉那个人他的号码没有存储,但你可以简单地将84除以2得到原始号码,然后你就不会真的很直白。
当然,"单向"散列比乘法更容易逆转,但我们并没有处理诸如"从其散列中找到原始的20万字符文件(或其他)的问题"但是"从其哈希"中找到一个9位数字。当然,许多不同的输入将散列为与一个特定SSN相同的值,但我怀疑存在很多9个字符串的数字冲突,这些字符串完全由数字组成。
我刚做了一些测试。我有一张桌子,里面有大约3200个真正的SSN。我使用SHA1对它们进行了哈希处理,然后将这些哈希值放入只包含一列的临时表中。我能够在大约8分钟内从001-01-0001
向上搜索1%的SSN。根据处理速度和总搜索空间,它将在不到3小时内完成(每1000万SSN需要约2分钟,因此88.89 * 2分钟)。这是来自内部 SQL Server,而不是运行可能更快,更快的编译程序。那不太安全!