有一个系统可以在登录表单上显示约40个用于输入密码字母的框(以隐藏密码的实际长度),并且只能编辑随机框(每次都相同的数量)。说明是-为了保护我免受键盘记录程序的侵害。似乎是合法的。但这是否意味着我的密码以纯文本形式保存?还是有任何已知的散列算法允许这样做?



注意:我并不是在问这是好是坏,我问的是可能性/散列的可行性/方法。

评论

评论不作进一步讨论;此对话已移至聊天。

#1 楼

否-在这种情况下,没有实际的方法来对您的密码进行哈希处理。

要使网站以这种方式工作,哈希处理必须允许您验证密码的5个字符的子集是否与一定的价值。这意味着您可以独自强行使用这5个字符,这很容易实现,一旦您知道5个字符,就可以很容易地对其余5个字符进行暴力破解。这在某种程度上类似于LANMAN密码的弱点。银行应用有时有时具有在服务器上散列的普通密码,以及仅部分输入且不在服务器上散列的附加身份验证码。这被认为是完全可以接受的,但是由于多因素身份验证是一种更好的解决方案而变得不那么普遍。在这种特殊情况下,尚不清楚这是一个坏主意。您需要权衡服务器妥协的风险和客户端按键记录程序的风险。实际上,风险更大的是客户。因此,尽管违背了正常的最佳实践,但该网站毕竟并没有那么笨。

评论


评论不作进一步讨论;此对话已移至聊天。

–Rory Alsop♦
2015年9月27日15:33

您确实意识到要证明答案是否定的,您必须在数学上进行证明?

– BAR
2015年9月27日下午16:52

请记住,权衡服务器与客户端妥协的风险并不仅意味着比较机会,还意味着比较后果。服务器表示所有用户数据均处于风险中,客户端表示仅受影响的用户数据中存在风险。 (可能还是可能不会导致您得出相同的结论。)

–hvd
2015年9月27日在20:21

@hvd,还要比较数字。客户端数量与服务器数量。

– Paul Draper
15年9月28日在1:59

#2 楼

正如其他人所说的那样,用散列算法解决此问题的任何尝试注定会失败。

但是,我认为值得探讨ING如何解决这一问题。 (免责声明:我从未在ING工作过,但我曾在其他大型银行工作过)。

ING可能会将您的密码存储在硬件安全模块中。这是防篡改的硬件,其设计目的是使系统甚至操作员也无法提取您的密码哈希。在内部,它可能以明文形式(或接近明文形式)存储您的密码,但只能通过“请输入字符x,y和z”与外界进行通信,并限制允许的尝试次数。

在这种情况下,密码的安全性取决于HSM的防篡改功能。已经发布了针对HSM的攻击,但是与RDBMS中存储的哈希相比,攻击面有所减少。

评论


有趣的一点!总是很容易提醒人们,有多种方法可以给猫皮毛。

–Jesse K
2015年9月25日14:58在

它可以用随机密钥加密,而密钥用公共密钥加密。然后,当需要对其进行检查时,这五个字符以及加密的密码和加密的密钥将被传递到HSM,后者对密码进行解密并执行检查。这样,存储不必在HSM中

–本
2015年9月25日15:14

您是否具有执行该技术的HSM的链接?我从未听说过HSM会这样做。

–尼尔·史密斯汀(Neil Smithline)
15年9月28日在18:52

#3 楼

可以实现的一种方法是存储一百个左右的部分密码哈希。每次用户使用部分密码登录时,都会将其标记为已使用。每次需要输入完整密码时,都可以重新生成哈希列表。

该方案确实削弱了针对暴力破解或密码分析的安全性,但是如果您经常不得不从不受信任的计算机登录,它可以保护免受密钥记录器的攻击。

我已经在旅行钱卡上看到了该计划,因为旅行者可能经常需要使用公用计算机上的帐户。不过,对于普通银行而言,我认为这只会削弱安全性。如果您的常规个人计算机感染了密钥记录器,则只需几次登录即可从部分密码中收集完整密码。

要加强这种方案以防止密码分析和暴力攻击,部分密码需要使用非常慢的散列来存储,例如PBKDF2具有很多回合。为了阻止攻击者同时并行蛮力破解哈希,您需要强制按创建密码的特定顺序使用部分密码。例如,使用第n个部分密码对数字列表和第n + 1个部分密码的盐进行加密,将迫使攻击者先解决第n个部分密码,然后才能开始对n + 1'进行操作。 th。

评论


我认为键盘记录器是不够的,因为它不知道字符的绝对位置。一个简化的示例:如果系统要求输入3个字符,并且您的键盘记录器记录了以下条目:F E D,BACC,FACC和DAC,您将不知道我的密码是FEEDBACK,BOLDFACED还是FRIEDBACON。 F E B和E D A的组合消除了其中的1个,使用I,K或N消除了2,但是当然,这些只是3个可能的密码。我认为仅键盘记录程序就需要很多次登录才能组装完整密码。

–丹·亨德森(Dan Henderson)
2015年9月25日在17:41

#4 楼

是的-可能他们只是简单地将要显示给您的所有组合都进行了哈希处理。 />
使用此方法更好地结合安全性,同时要注意存储空间:


对明文密码进行加密,并将其放置在某种冷存储器中。
定期解密密码以创建新的组合并散列这些组合。

这样可以保持合理的存储空间。并且您未隐藏的密码应位于系统的更安全层中。

#5 楼

它可能不会被散列,但可能已加密存储。从理论上讲,他们可以将阈值方案与允许的ASCII字符用作键,然后检查结果是否适合该结果。通过这种方式(理论上),您无需仅将密码存储为解决方案。

PS。例如,请参见http://programmingpraxis.com/2011/06/17/adi-shamirs-threshold-scheme/

评论


也称为秘密分享

– Benubird
2015年12月9日15:16



#6 楼

假设密码长度为40个字符。假设字符可以解释为某些合适的有限域F(Galois域)的数字c_1,c_2,... c_40。还要假设F至少有40个元素。

假设我们为F的40个预定义非零元素计算插值多项式p,使得p(a_j)== c_j。现在,我们存储此多项式的35个系数以及其他5个(加盐的)哈希值。然后计算哈希值。如果5个字符中的任何一个错误,我们将得到一个不同的多项式,从而得到一个不同的哈希值。因此,您可能希望将哈希存储在某些专用的硬件安全模块中,就像James_plc已经指出的那样。

所以是的,这是可能的。但是,如果您的安全存储遭到破坏,破解至少就像强行使用5个字母的密码一样容易破解。 >

#7 楼


这是否意味着我的密码是以纯文本形式保存的?


很可能是以纯文本形式或加密的形式,但是不确定。

例如,当您最初提交密码时,它们可以哈希并保存密码及其所应用的字符索引的5个字符的不同组合。

但是,任何能够访问该信息和哈希算法的人都可以轻松破解5个字符的哈希并重新组合它们以获取您的原始密码,因此,即使对其进行了哈希也很弱模型。

#8 楼

我想您可以存储任何X个字符的所有组合的哈希表,其中X是您需要提供的字符数。

这不是一个很强的哈希值,即使其余哈希值由已知字符组成。可以从用户盐中导出其余的垃圾字符,或者从提供的X字符中以某种方式导出,但那仍然不是最强的哈希值。

#9 楼

我看不到为什么身份验证算法无法将您的密码子字符串的所有组合都存储为针对字符位置的有序列表的哈希,因此如果您的密码是:

密码

,那么将有一个(key,hash)表,其中的键例如是

'1'仅用于首字母
'1,2'仅用于首字母和第二字母
仅对第四个,第五个和六个字母使用'4,5,6'

,并针对这些键存储所指示字母字符串的哈希,因此针对

'4,5,6'将是示例密码中的哈希值('swo')。

当然,问题在于,除非对这些哈希值加盐,否则将它们简单地反向即可。每位用户加盐,即使这样,如果销售受到影响,出于显而易见的原因,暴力破解短序列的哈希值还是比较简单的(保持盐的秘密将是解决方案)。

不知道他们还能怎么做...

有趣的问题tion。

评论


这将是一场灾难。您必须存储大量的哈希值,每个哈希值都可以很容易地用暴力破解。问题的答案是否定的。

–paj28
2015年9月23日10:33在

@ paj28为什么您说答案是否定的?在我看来,应该有可能构造一个不可逆的函数,在选定的一组值中其值为零,每个值对应于在密码中获取五个字符。

– David Schwartz
2015年9月23日在10:39

@DavidSchwartz即使被证明是可行的,它也只能解决paj28提到的两个问题之一。您不再需要存储散列的负载,但是仍然很容易受到暴力攻击:假设攻击者想要破解密码,并且可以访问存储的数据。首先,她尝试强行使用前5个字符-这是可能的,因为存储的数据足以验证她的猜测,而且很容易,因为最多有40位熵,可能更少。然后,她尝试强行使用接下来的5个字符。她以这种方式继续前进,直到破解为止。

–James_pic
2015年9月23日下午12:09

@DavidScholefield盐通常存储在密码哈希旁边,以进行验证。因此,如果有人试图破解哈希,则不应假定盐是秘密的。

–otus
2015年9月23日15:05

@DavidSchwartz我几乎不会将排除99.9999%的密码称为“小帮助”。而且,更复杂的方案仍然有可能成功。假设攻击者有一个候选密码的前5个字符。现在,她可以猜测第6个字符,并使用前5个字符的组合来检查猜测。如果找到匹配项,则现在有6个字符,可以猜测为7个字符。否则,她会回溯。也许聪明的哈希算法可以以某种方式阻止这种情况,但是尚未提出具体的算法。

–James_pic
2015年9月23日19:53在

#10 楼

答案是从安全角度考虑,这是一个坏主意,但从技术上讲,可能会对其进行哈希处理。

如果您输入的是您完整密码的随机子集(例如一次输入第一个,第二个,第五个,第六个和最后一个字符,下次输入不同的随机选择),则可以完成此操作通过(在初始保存时)将密码分成预定的子集,然后进行哈希处理。

本质上,这只是让用户输入多个密码而不知道自己在做什么的一种奇特方法。然后,用户根据可用的框知道要输入的密码。

虽然可以采取一些措施来抵消它(强制使用更长的初始密码,每天严格进行3次登录尝试,增加已保存的多次密码的数量并在每次登录尝试后切换到新密码)并且不允许重复登录,直到成功登录等),这通常会使您的密码更短(在您的情况下为5个字符),因此较弱。

顺便说一句,无论如何,您从键盘记录程序获得的保护都是最小的。只需按键记录器实际查看您的几个登录名,然后找出您的完整密码即可。更好的密钥记录安全性是使用两因素身份验证,而不必太复杂或昂贵。当用户登录时,只需向他们提供一个可以写下的代码,然后输入即可下次登录。

#11 楼

是的,这让我想起了零知识证明协议。密码不会被截取,因为它永远不会被用户传输,甚至不会被用户完全输入。 (您无法从协议中学习密码。)但是机密应该足够强。如果您问一个字符,那么当您看到每个位置后,当然会知道密码。散列也是如此。如果哈希值很弱,则可以将其破坏。

编辑:我认为这种情况下的哈希值不是md5哈希值或类似值,在这种情况下,哈希值是指包含密码的秘密。在零知识文档中,通常会有一个彩色图形或一个大多项式。我不记得详细信息。

也许将其视为主要分解。假设您有一个素数清单并在数据库中存储(Product:i:p [i] ^ i)(例如504),我问您第三个素数...如果您回答2,则可以轻松地检查它第三个数字...因为504 == 7 * 3 * 3 * 2 * 2 * 2现在移到了较大的质数,例如在强加密中。

评论


好的,如果您只拥有一个哈希值和一些来自密码的字母,那么如何测试密码?您是说是因为知道一种方法还是只是因为还没有被证明?

–Mołot
15/09/23在21:29

“您无法从协议中学习密码。”无论您指的是协议的哪一部分,您都绝对可以。

– Ry-
2015年9月24日,下午4:33