【问题标题】:Obfuscate Phone Numbers Consistently始终混淆电话号码
【发布时间】:2021-06-01 12:48:31
【问题描述】:

我们有电话号码字段需要在 UAT 环境中进行模糊处理,问题是号码必须是唯一的,并且应该与使用其他数据库的其他数据处理相匹配,这些数据库也被混淆了。我正在尝试创建一个能够可靠地对数字进行加扰的函数,并且每次传入的每个数字都会使用某种我们将安全存储的加密密钥产生相同的加扰数字。我还没有找到一种方法来可靠地以相同的 10 位格式重现数字。有什么想法吗?

【问题讨论】:

  • 为什么不散列它们?但是,散列不会让您“返回”到原始数字。散列的好处是您不需要密钥。
  • 使用假数据,或者您可以使用随机数生成器生成 7 位或 10 位数字。使用原始数字作为种子。通常时间用于创建伪随机数,但在您的情况下,如果创建相同的数字并不重要。
  • 您需要在多大程度上确定没有冲突?最安全的解决方案是将不同的电话号码放入一个表格中,然后在表格中分配一个“随机”号码。
  • 根据您的 SQL Server 版本,您可能还想查看ENCRYPTBYPASSPHRASEdocs.microsoft.com/en-us/sql/t-sql/functions/…
  • 另外,BINARY_CHECKSUM([PrimaryPhone]) 似乎可以工作,但会生成重复项,因此它不是唯一的...运行此之后的匹配项比以前更多..

标签: sql sql-server database security


【解决方案1】:

为什么不使用任何可以为您提供 guid 的哈希函数?

例如

hash('012345677899') 在python中

SELECT HASHBYTES('SHA2_256', '0103203803') 在 t-sql https://docs.microsoft.com/en-us/sql/t-sql/functions/hashbytes-transact-sql?view=sql-server-ver15

【讨论】:

  • HASH 不是 T-SQL 函数。
  • 请注意,如果您使用散列,结果取决于输入是否是字节精确的。也就是说,破折号、括号等格式字符需要完全匹配。通过只留下数字进行散列来“清理”它们可能很方便。
  • 这个答案返回一个VARBINARY,如果你需要一个VARCHAR,你可以这样做:convert(int, hashbytes('SHA2_512', '012345677899')),然后根据需要格式化。
  • 大多数国家/地区的电话号码并没有那么大。运行所有可能的数字,对它们进行散列,并将它们与存储的散列进行比较并不需要大量的计算能力,因此作为一种增加机密性的方法,可以防止有人认为这是不好的。散列不是加密,一般而言,安全有效地加密小块数据并非易事。
  • 我们尝试了哈希函数,但它创建了负数。我们正在寻找一种方法,每次都能可靠地以 10 位正数值结束。
【解决方案2】:

我相信Column Encryption 是您正在寻找的。您可以加密列,然后传递加密值。

SQLShack 也写得很好。

【讨论】:

    【解决方案3】:

    列加密不是 Steve 想要的,电话号码字段需要在 2 个单独的表中从生产刷新后在较低的环境中进行模糊处理,并保证在该过程完成之前和之后匹配相同数量的行。

    下面的过程似乎有效,但之前的计数与之后的计数不匹配。

    SET [somePhone] = BINARY_CHECKSUM([somePhone])

    Microsoft 动态数据屏蔽可能是更好的选择。

    https://docs.microsoft.com/en-us/sql/relational-databases/security/dynamic-data-masking?view=sql-server-ver15

    【讨论】:

      猜你喜欢
      • 2021-08-03
      • 1970-01-01
      • 2018-03-06
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      • 1970-01-01
      相关资源
      最近更新 更多