我正要重置我的Facebook密码,并出现以下错误:


您的新密码与您当前的密码过于相似。请尝试使用另一个密码。


我假设Facebook仅存储密码哈希,但是如果这样,它们如何衡量密码的相似性?

问题就好了吗?

问题是-这怎么可能以及其含义是什么?

预先感谢。

UPDATE

我没有弄清楚-我没有被要求提供新旧密码。这是“重置密码”过程,在该过程中,我仅提供了一个新密码,因此大多数建议重复的答案都不适用。

UPDATE2


谜题已解决-请参阅注释(来自Facebook工程师)

评论

下面已回答此问题,并已由看过该代码的人确认正确!无需其他猜测。

我注意到许多网站都说“您之前已经使用过该密码”。因此,有些网站不只是比较最后一个网站。我想您可以称其为安全措施,但我忍不住觉得这是不必要的。

有点重复:security.stackexchange.com/questions/47840/password-security(由于您排除了最近输入的密码,因此大多数答案并不太完美,但有些答案仍然适用,其中之一非常接近此处的最佳答案)

“ Facebook是否存储纯文本密码?”是的。

#1 楼

让我们希望并假设Facebook仅存储当前密码(可能还有以前的密码)的哈希值。

这是他们可以做的事情:


用户设置第一个密码到“ first”,fb存储hash(“ first”)。
之后,用户重置密码并被要求提供新密码“ First2”
Facebook可以生成一堆密码(类似于新密码) ):[“ First2”,“ fIrst2”,“ firSt2”,...“ first2”,...“ first”,...],然后将每个哈希与存储的哈希进行比较。

这是我想到的唯一解决方案。还有其他吗?

评论


这个答案就是Facebook的做法。来源:我已阅读并修改了用于密码检查的源代码。

– Jeff Ferland♦
2014年3月17日在21:54



为什么Facebook会打扰?

–证人保护ID 44583292
2014年3月19日下午4:10

@ TruthOf42实际上,这似乎是相反的-不会存储类似密码的哈希值。他们唯一关心密码相似性的时间是在您创建新密码时,因此他们会将新密码的哈希值进行哈希处理,将其与旧哈希值进行比较,如果不匹配则将它们丢弃(如果匹配) ,他们会警告您)。

–cpast
2014年3月19日在20:02

@MichałŠrajer当前,Facebook在登录时测试完全颠倒的大小写。 Facebook会在密码更改后测试完全颠倒的大小写和首字母大写的颠倒。

– Jeff Ferland♦
2014年3月20日19:04



但是您是否不需要插入您当前的密码来更改为新密码?他们可以在进行哈希和之前进行比较

– BlueWizard
16年5月5日在21:39

#2 楼

我不知道他们是否这样做(甚至不使用Facebook),但是他们也有可能使用硬件安全模块(HSM)进行加密处理,这些模块不存储哈希密码,而只是可逆地对其进行加密。由于必须处理大量的授权请求,因此这很合理,因为它比安全(读取:缓慢)的密码散列要快几个数量级,同时仍然提供安全的密码存储。

HSM然后可以对其进行编程,以比较存储的密码和新密码作为其功能之一的输入,并仅返回其结果(在我们的情况下甚至可以是布尔值),而原始密码甚至从不在任何地方以明文形式传输或存储。它们的内部存储器(防篡改)。通常将其称为机载安全密钥和应用程序存储/处理。

许多银行使用HSM,因为对其进行正确的实施还需要设备本身及其使用方式的物理安全性。可以访问(而且,它们相当昂贵),但是显然,这可以在不泄露密码的情况下安全地处理密码,从而提供了更大的灵活性。

评论


我不信。 HSM提供安全且快速的加密处理,但不提供大容量存储。我不知道有任何HSM能够存储所有Facebook用户的密码。

–垫
2014年3月17日在10:53

@ user1039462听说过防篡改安全存储吗?如果对DoD来说还行,为什么对Facebook来说不行?是的,如果您愿意为此付费,那么您可以拥有完全足够的存储容量。并非所有HSM都以USB密钥的形式出现。 ;)

– TildalWave
2014年3月17日在11:11

我确实自己操作了一些基于PCI的HSM,但是它们都具有数百个密钥的存储容量。您能否指出一个存储量大的示例?我很好奇。

–垫
2014年3月17日在12:53

您需要多少把钥匙?您可以使用网络连接的HSM以及外部加密和防篡改卷。或者,据我所知,他们可能已经构建了自己的具有大量内部卷的HSM设备。例?哦,不知道,从Luna SA到AWS CloudHSM?

– TildalWave
2014年3月17日在13:24

#3 楼

对此只有一个正确答案。没有人知道(除了Facebook)。

Facebook可以将您的Facebook密码存储为纯文本格式,但是也可能存在一些使用模糊哈希或类似密码的预先计算哈希的方案。

除非我们要闯入Facebook并审核其所有资产,否则实际上是无法知道的。

评论


如果您真的设法闯入Facebook ...请善待并倒带;)

–人类与和平
2014年3月16日20:56在

没用的答案。显然,我们正在寻找Facebook(更重要的是我们的网站)在保持安全的同时可以做到这一点的方法。

– Navin
2014年3月17日在2:39

这个答案不是真的正确,因为如果FB正在存储纯文本密码,则可能有证据证明它们正在这样做(例如,以某种可能的形式,如果它们没有存储纯文本,则不可能)。我将OP的问题视为对此的疑问;特别是,观察到的行为是否证明已存储明文密码?

–R .. GitHub停止帮助ICE
2014年3月17日在4:13

请注意,一位前Facebook工程师(和现在的钻石)确认,接受的答案实际上就是Facebook的做法,因此,这确实是不正确的。另外,OP并没有真正询问他们如何实际执行-他们只是在询问Facebook如何做到这一点。

–EJoshuaS-恢复莫妮卡
19年5月23日在19:52



#4 楼

另一种可能性是,Facebook存储您的密码的哈希值和密码的SOUNDEX的哈希值。然后,当您输入新密码时,它可以将其SOUNDEX的哈希值与以前存储的密码进行比较,并回答密码太相似。

当然,这纯粹是猜测。

评论


欢迎加入俱乐部,但我肯定希望这不是他们的工作方式,这很容易与密码字典匹配,并且如果数据库遭到破坏,则可以将大多数帐户的密码字典范围缩小到几个可能的选择。假设他可以自由公开它,我们应该真的尝试召唤@JeffFerland来回答它。这里的一个mod和Facebook的一名生产工程师应该做到这一点。 :)

– TildalWave
2014年3月17日在0:59

可能是合理的,因为密码可以通过soundex进行加密,然后再加密soundex变量以与以前的加密soundex版本进行比较。

–mootmoot
17年4月26日在13:50

#5 楼

另一可能性是fb不会散列,而是使用其主密钥加密密码。比起他们可以随时解密它来将它与您的新版本进行比较。


我们希望不要-应当对其进行哈希处理!
正如Rell3oT所指出的那样,除了fb之外没有人知道。因此,我们所能做的就是大肆猜测。


评论


在假设的情况下,“ facebook使用主密钥”,假设使用非对称是合理的,否则系统将需要始终在内存中拥有“主密钥”,并且闯入服务器意味着还知道“主密钥”可用在内存中,因此使加密的东西变得很纯净

–人类与和平
2014年3月16日21:01

为了安全起见,这与存储纯文本密码相同。

–R .. GitHub停止帮助ICE
2014年3月17日在4:13

仍然经常使用-我也希望(希望如此)facebook有一些熟练的安全专业人员知道这些知识。

– mo
2014年3月17日在6:40

#6 楼

提供有关密码存储方法本身的更多详细信息。
早期的历史性回答早于Facebook的任何确认。但是在密码14上,阿莱克·穆菲特(Alec Muffett)进行了一次演讲,其中他详细描述了Facebook上的密码存储。
在演讲中,他确认Facebook并不是以纯文本格式存储密码,而是使用了多步操作能够抵抗各种攻击的方法:

...如下:
$cur  = 'plaintext'

# MD5 the plaintext.
$cur  = md5($cur)

# Hash SHA1 with a 160-bit salt.
$salt = randbytes(20)
$cur  = hmac_sha1($cur, $salt)

# Hash SHA256 with a secret salt, using an internally abstracted crypto service.
$cur  = cryptoservice::hmac($cur)
        [= hmac_sha256($cur, $secret)]

# Run the result through the scrypt KDF
$cur  = scrypt(2^14, 8, 1, $cur, $salt)

# Use SHA256 (to reduce and normalize the large scrypt result)
$cur  = hmac_sha256($cur, $salt)

这种抵抗水平应该不足为奇,因为Muffett是破解,第一个有效的密码破解工具之一。
因此,我们现在已经确认Facebook不会以纯文本格式存储密码。

评论


“在scrypt KDF中运行结果(使用未公开的调整参数)”在会议的后续问题中,在下午18:15的youtu.be/7dPRFoKteIU?t=1093中得到了回答。参数是(2 ^ 14,8,1)

–与莫妮卡(Monica)
12月14日10:50

好收获-更新!

–罗伊斯·威廉姆斯
12月15日下午1:05

知道FB为什么要经历如此漫长而circuit回的密码哈希过程吗?我的意思是,像bcrypt / scrypt / Argon2id这样的良好密码哈希函数还不够吗?

–没人
12月15日下午6:38

其中一些具有历史/向后兼容性-将以前的方案包装在新方案中,等等。

–罗伊斯·威廉姆斯
12月16日7:19