我正在寻找一个可以估计密码强度的开源组件。在网上搜索,我发现这很有趣:https://github.com/lowe/zxcvbn(有关详细信息,请访问:https://tech.dropbox.com/2012/04/zxcvbn-realistic-password-strength-estimation/)。
给我留下深刻印象的是,与"常见密码、常见美国名字和姓氏、常见英语单词以及常见模式(如日期、重复(aaa)、序列(abcd)和QWERTY模式)"相比,能够分析给定密码。
有人知道类似的东西可以用于iOS/AMac应用程序吗?如果没有,最好的开始方式是什么?
因此,一年多后,伟大的Mattt Thompson终于向GitHub发布了他自己的库,用于验证密码强度、验证规则,并对强度进行评估。
它在这里:https://github.com/mattt/Navajo
看看GitHub上名为zxcvbn-ios
的开源库,它是为Objective-C重写的:
https://github.com/dropbox/zxcvbn-ios
除了密码上有实际的英语单词会使其容易受到字典攻击外,您还可以简单地将其分析为对纯暴力攻击的抵抗力。
检查字典攻击的安全性必须使用大型单词列表。我还必须考虑到实际的字典攻击是如何工作的,并混合字典中的单词,以及它们是否会产生变化,比如用A换4等等。
让我们专注于暴力攻击,我相信我可以帮助你。
对于暴力攻击,您首先需要定义一个字符集,以便攻击生成密码。第一次尝试可能会很快获得许多密码,那就是只使用小写字母。
如果只有小写字母(根据语言的不同,大约有25个),密码为N个字符,则您将有25个N种不同组合的幂。例如,小写6个字母的密码有244140625种不同的可能性。
现在让我们加上大写字母,再加25个(总共50个)。在一个6个字母的密码中,我们将有50的6个组合的幂,15625000000。
加一些数字?再加上10个字符。
如果你添加一些符号,你可以再添加20个常见的符号(猜测数字)。
所以基本上,你要做的是分析一个密码,检查它是否有小写字母(可能总是),然后在字符集计数上加25。它有大写字母吗?还有25分。它有号码吗?还有10分。它有其他符号吗?还有20分。
一个使用小写、大写、数字和符号(~80个字符集)的10个字符密码将有大约10737418240000000个组合。
现在计算密码的大小并计算。characterSetCount为nCharacters的幂。
因此,你将得到的数字是攻击者原则上必须检查的组合数量,以确保他能找到正确的密码。您还可以假设攻击者不必检查所有密码就能找到正确的密码。检查其中一半会大致给它找到和找不到的机会。所以保留一半的组合作为参考。
现在,使用哪种哈希算法来存储密码?
让我们假设MD5。对于MD5,我发现了http://bvernoux.free.fr/md5/index.php它表示每秒检查2亿个哈希。
得到你的一半组合数,除以2亿,你就得到了攻击者用这种硬件和方法获得你的密码所需的秒数。例如,包含我们所讨论的所有类型字符的10个字符密码大约需要26843545600秒。大约425年。
有了这个,你可以分析最坏的情况。这并不准确,但它可以给你一个估计。
另一件需要检查的重要事情是,密码哈希是否使用了salt。使用盐存储密码(http://en.wikipedia.org/wiki/Salt_(密码学))是当今普遍的做法。如果你不使用这种方法,你很容易受到彩虹桌的攻击(http://en.wikipedia.org/wiki/Rainbow_table),在这种情况下,所有这些数学都是无用的,因为你的密码非常不安全,直到计算彩虹表的字符数非常高(16个左右)。
希望它能有所帮助!