我想SHA256哈希电话号码以隐藏它们。这是一个好主意吗?我还有其他方法可以确保此安全吗?

评论

您需要隐藏哪些电话号码?

备注(不是答案):电话号码有一个特别的问题。通常,添加后缀会使数字起作用。有时添加空格或其他字符或某些前缀也可以做到这一点。例如。我住的地方0123456789与01234567890、01234567891、01 23 45 67 89,+ 33123456789相同。这使得基于电话号码的黑名单(散列,加密等)容易被规避,除非对电话号码进行严格的标准化,这并不容易。
你的实际问题是什么?当某人试图隐藏电话号码时,这表明他们需要更多隐藏信息。答案下方的文章频率分析如何应用于现代密码?可能对您的真正事业有所帮助。

@David Z:Kerckhoffs的(第二个)原则或Shannon的“敌人知道系统”,这使得有必要假设对手知道您的哈希值。另外,电话号码作为密码的流行用法使我们有可能在攻击密码数据库时对它们进行测试。

当输入来自较小空间时的相关安全散列

#1 楼

不,哈希电话号码不是一个好主意。电话号码数量有限,因此对手很容易尝试对所有电话号码进行哈希处理。然后,您可以简单地将每个哈希与存储的哈希进行比较。通常,您不必处理所有电话号码,无论如何都只需要处理电话号码的一部分(对于在逻辑上不同的特定国家或地区)。 ,但这仅意味着所需的时间乘以一个较大的恒定值。它不会改变操作顺序。如果子集足够小,它可能不会阻止对手执行所有必要的计算。
在这种情况下,您可能需要加密电话号码。或使用键控哈希,例如HMAC。对于这两个选项,您都需要对秘密密钥进行密钥管理。这不只是对数字进行哈希处理那么容易。

评论


$ \ begingroup $
限制不好量化。 $ 2 ^ {256} $也受到限制。我宁愿说最多有$ 10 ^ {10} $个电话号码($ \大约2 ^ {34} $),实际上更少,ABC-XYZ-XXYY,通常ABC少于10 ^ {3}。
$ \ endgroup $
– kelalaka
20年6月30日19:50



$ \ begingroup $
是的,只有几十亿个,您实际上并不需要太多的计算。可能是您只想检查其中是否有几个电话号码,在这种情况下,您也许可以用手指数一下。
$ \ endgroup $
–马腾·博德威斯♦
20年6月30日在20:24

$ \ begingroup $
@kelalaka电话号码的(有效)号码空间为15位数字。您只是在看其中的一部分。所以它更像是2 ^ 50 ...-当然,您的其余评论都是有效的。
$ \ endgroup $
–我和Monica在一起
20年7月1日在7:14



$ \ begingroup $
@我和莫妮卡(Monica)我不确定你能说那么多话吗? libphonenumber声称某些德语号码超过了ITU-T 15位标准,并且某些系统允许您自动拨打内部分机,该分机可以是任何长度。另一方面,知道目标号码在特定区域中的攻击者可能只有5位数字可以猜测。我认为在不了解应用程序更多上下文的情况下讨论数字的可能范围并没有真正的意义。
$ \ endgroup $
–IMSoP
20年7月1日在11:03

$ \ begingroup $
@ I'mwithMonica:请记住,即使所有可能的电话号码的总空间很大,攻击者仍然可以通过假设“该空间的某些局部”来完成很多工作(尤其是因为他们对应用程序有足够的了解,因此能够猜测哪个本地部分)。如果他们只能破解一组电话号码中的一半,那可能仍然是一个巨大的问题。
$ \ endgroup $
–ruakh
20年7月1日在21:44

#2 楼

从一般意义上讲,该问题被称为哈希函数上的小输入空间,总之,简单的哈希将不安全。与哈希值匹配的输入值称为图像前攻击。在安全的加密哈希函数中,映像前攻击需要$ \ mathcal {O}(2 ^ n)$-time,其中$ n $是哈希函数的输出大小,在SHA256中$ n = 256 $
如果输入空间很小,这将给攻击者带来巨大的推动力,也就是说,他们只能强行使用小空间。如果存储了10位数字的电话号码,则攻击者仅需要搜索$ \大约2 ^ {34} $空格,如果15则只能搜索$ \大约2 ^ {50} $。好的GPU甚至可以实现最后的空间,请参阅hashcat性能。因此,人们需要一种减慢攻击者速度或使其更难的方法。该数量可以根据目标的能力进行调整。例如,使用100K迭代将使攻击者的时间减慢100K,或将在有限的时间内将其搜索空间能力降低$ 2 ^ {16} $。作为较高的计算能力,比特币矿工的集体能力在一年内可达到$ \大约2 ^ {92} $倍SHA256。如果您的敌人拥有此功能,那么减慢将无济于事。
另一选择是使用答案中所述的每个数据加盐,以及慢速和难以存储的哈希函数。这只会减慢攻击时间,并防止预先计算的表(例如Rainbow表)。攻击者的执行时间将增加目标哈希的数量。


更难的是,HMAC是首选,这是一个键控哈希函数,也可以使用SHA256进行初始化。没有密钥的攻击者没有运气来攻击哈希值。另一种方法是加密。尽管电话号码应该是唯一的,但是如果使用ECB模式可以用来发起一些攻击以识别该号码,则该号码是唯一的。攻击者可以注册并输入目标电话号码作为其电话号码,以标识数据库上的目标位置。因此,应首选Ind-CPA安全模式,例如CBC或CTR。HMAC和加密都需要解决另一个问题。密钥的存储。为此,可以首选硬件安全模块(HSM)。无法从模块中提取密钥,并且可以在这些设备上执行HMAC和加密。如果攻击者访问使用HSM的应用程序服务器,则唯一的希望是他们只有有限的权限才能将HSM用作从属服务器。
结论:使用加密或HMAC。如果有人担心密钥丢失或访问,请使用HSM在HSM上存储和执行加密/ HMAC。

#3 楼

散列具有有限长度或字符集的数据始终是一个坏主意。
例如德国的电话号码通常不超过12位数字。
第一位数字始终是0和绝大多数数字会长到3位数字,因为通常保留给紧急服务使用。
这实际上给我们留下了10^11-10^3个可能的组合。取决于所使用的算法。
当使用当今绝对不安全的MD5,并被8倍Nvidia GTX 1080和Hashcat破解时,只需不到10分钟即可完成。不幸的是,根据我的经验,仍然有成千上万个服务,即使不是数百万个服务,甚至使用不安全的算法对密码进行哈希处理。
当使用bcrypt时,您可以将其减慢2000倍以上,但是,这仍然是非常不安全的。通常,还需要根据后端性能要求来设置成本。
如果攻击者可以猜测要破解的电话号码的位置,则只需几秒钟。尝试哈希IP地址时遇到相同的问题,这也不是隐藏明文的安全方法。

评论


$ \ begingroup $
德国的电话号码并非总是以01开头。手机号码只是这种情况。区号将2到9的数字全部用于陆线。 en.wikipedia.org/wiki/List_of_dialling_codes_in_Germany有很多细节
$ \ endgroup $
– Nzall
20年7月1日在12:48

$ \ begingroup $
@Nzall您显然是正确的。我只想到手机号码!仍然是一小部分:-)
$ \ endgroup $
– dmuensterer
20年7月1日在13:26

$ \ begingroup $
实际上,德国的电话号码可以为3位数字。这样,它们要么是紧急服务,要么仅是本地可拨打的。但是有些局域网具有(通常是传统的)三位数电话号码。
$ \ endgroup $
–我和Monica在一起
20年7月1日在20:57

$ \ begingroup $
增长十倍是严重的低估。我可以在CPU上以36 MHash / s的速度计算SHA-512,大约需要四分钟来强行使用所有可能的电话号码。
$ \ endgroup $
–马克
20年7月1日在21:40

$ \ begingroup $
@dmuensterer这就是bcrypt的工作方式,必须给它设置一个开销。参见gist.github.com/epixoip/…和gist.github.com/epixoip/…。
$ \ endgroup $
–施韦恩
20年7月2日在17:23



#4 楼

或者,您可以对电话号码加注盐以避免预先计算的攻击。<​​br />已知的盐注将有助于对抗已经对所有可能的电话号码进行哈希处理但仅增加一个数量级工作的对手
如果您可以保持盐分的私密性,则会提高蛮力攻击的门槛(实际上,您是将盐分的熵位加到电话号码)。

评论


$ \ begingroup $
是的,这将避免使用salt进行预计算攻击,但这不会更改强行强制使用有限集合的操作顺序。而且,如果您要加盐,则使用密码散列/ PBKDF和其他工作因素会增加复杂性。
$ \ endgroup $
–马腾·博德威斯♦
20年7月1日在7:38



$ \ begingroup $
正如@MaartenBodewes已经正确指出的那样,这不会使其变得更加安全,因为有限的短集合总是很容易破解。
$ \ endgroup $
– dmuensterer
20年7月1日在10:41

$ \ begingroup $
如果您可以将Salt保留为私有,则可以仅将哈希保留为私有。
$ \ endgroup $
–user253751
20年7月1日在10:46

$ \ begingroup $
秘密盐被称为“胡椒粉”。当然,如果您知道机密后可以通过尝试所有选项来猜测电话号码,那么不妨使用秘密密钥而不是秘密胡椒来加密。是的,可以使用,胡椒粉可能是个好主意。
$ \ endgroup $
–马腾·博德威斯♦
20年7月1日,11:39



$ \ begingroup $
@dmuensterer取决于盐的长度。首先,盐是每个经过哈希处理的电话号码的随机不同字符串(如果是秘密固定的,则称为“胡椒”,如Maarten所述)。因此,如果具有足够好的RNG和足够大的盐,则可以使其抵御预先计算的彩虹表(但不能抵御暴力破解)。不过,如果他们需要它们,那总比以明文形式存储它们更好,尤其是当它们很多时...
$ \ endgroup $
– Matija Nalis
20年7月1日在12:18



#5 楼

一种替代方法是按照先前答案中的建议对电话号码进行加密。例如,移动连接身份服务使用特定算法对MSISDN(又称电话号码)进行加密。
此GSMA规范提供了有关对有效负载进行解码的信息: :


,URL编码: 。


服务操作员应用其私钥对RSA编码数据进行解码。 />

然后,服务运营商将解密数据的初始(数字)部分提取为MSISDN,由(|)管道分隔,并将其用于API服务/用户中的任何相关目的登录。



在这种情况下,它使用RSA加密,并且只有移动网络运营商才知道私钥。 e:
  login_hint=ENCR_MSISDN%3A0bb3020c7758f34e012da3f0bf13dc7674b3a9527
  6e804388d5aae4a034fe442a65e03027d0651da3b0646df6c11d3c5d6f46879480b
  623bd5024d9e0879727f46fbd1e8f5383a115678ea638a4ba5399a2dd37138246e
  db06718bb44be98f5331a1331902d6333993642e2f25197961ee0b0a14ddf66083
  4d49f7f385d82cad5a12003cd8aa235a92b71589110d76df382eab80b12a8dfa6d0
  5b4ca548538ac4b09a2868448957604eb52b1ceecc89dfe836e7113e51645c2a14f
  ff900228a8475983435647e88552a96eb692685b12abfc7ae0ad2bc23d30b3c8d82
  8ca101e186455b4d618a8c9022662ee1c5b8ffea40defdb92a20dce39bdbedcbf78
  5a2e