Iphone 密码强度库-目标C

Iphone 密码强度库-目标C,iphone,ios,objective-c,macos,passwords,Iphone,Ios,Objective C,Macos,Passwords,我正在寻找一个开源组件,可以估计密码的强度。 在网上搜索时,我发现这很有趣:(欲知更多详情:) 给我留下深刻印象的是,能够将给定密码与“常见密码、常见美国姓名和姓氏、常见英语单词以及日期、重复(aaa)、序列(abcd)和QWERTY模式等常见模式进行比较。” 有人知道类似的东西可以用于iOS/Mac应用程序吗?如果没有,那么最好的开始方式是什么?除了密码上有实际的英文单词,这会使密码容易受到字典攻击之外,您可以简单地将其分析为抵抗纯暴力攻击 针对字典攻击检查安全性时必须使用大的单词列表。我还必

我正在寻找一个开源组件,可以估计密码的强度。 在网上搜索时,我发现这很有趣:(欲知更多详情:)

给我留下深刻印象的是,能够将给定密码与“常见密码、常见美国姓名和姓氏、常见英语单词以及日期、重复(aaa)、序列(abcd)和QWERTY模式等常见模式进行比较。”


有人知道类似的东西可以用于iOS/Mac应用程序吗?如果没有,那么最好的开始方式是什么?

除了密码上有实际的英文单词,这会使密码容易受到字典攻击之外,您可以简单地将其分析为抵抗纯暴力攻击

针对字典攻击检查安全性时必须使用大的单词列表。我还必须考虑实际的字典攻击是如何工作的,并混合字典中的单词,以及它们是否有变化,比如A换4等等

让我们集中讨论暴力攻击,我相信我可以帮助你

对于暴力攻击,您首先需要定义攻击将用于生成密码的字符集。 第一次尝试可能会获得许多密码,而且很快就会使用小写字母

如果只有小写字母(根据语言的不同,大约有25个)和N个字符的密码,那么您将有25到N个不同组合的幂。例如,小写6个字母的密码有244140625种不同的可能性

现在让我们加上大写字母,再加上25个(总共50个)。在一个6个字母的密码中,我们有50到6个组合的幂,156500000

加上一些数字?再加10个字符

如果您添加一些符号,您可以添加另外20个常用符号(猜测数字)

所以基本上你要做的就是分析一个密码,检查它是否有小写字母(可能总是),然后在字符集计数中加上25。 它有大写字母吗?再给伯爵25英镑。 有号码吗?再数到10。 它有其他符号吗?再给伯爵20英镑

使用小写、大写、数字和符号(~80个字符集)的10个字符的密码将有大约107374182400000000000个组合

现在计算密码的大小并进行计算。characterSetCount为nCharacters的幂

因此,您将得到的数字是攻击者原则上必须检查以确保找到正确密码的组合数。您还可以假定攻击者不必检查所有密码即可找到正确的密码。检查其中的一半将大致给它找到和没有找到的机会。因此,保留一半的组合作为参考

现在,使用哪种哈希算法来存储密码

让我们假设MD5。对于MD5,我发现它表示每秒检查2亿个哈希

得到你的半个密码,再除以2亿,你就得到了攻击者使用该硬件和方法获取密码所需的秒数。例如,包含我们讨论过的所有字符类型的10个字符的密码大约需要26843545600秒。大约425年

有了这个,你可以分析最坏的情况。这不准确,但可以给你一个估计

另一个需要检查的重要事项是密码哈希是否使用了salt。使用盐存储密码()是当今的常见做法。如果你不使用这种方法,你很容易受到彩虹表攻击(),在这种情况下,所有这些数学都是无用的,因为你的密码在计算彩虹表的非常高的字符数(16左右)时是非常不安全的


希望有帮助

因此,在一年多之后,伟大的马特·汤普森终于向GitHub发布了他自己的库,用于验证密码强度,使用验证规则,并对强度进行评估


这里是:

看看GitHub上名为
zxcvbn ios的开源库,它是为Objective-C重写的库:


从引用的项目中窃取单词列表并重写代码?(请注意,一个好的密码强度评估师不应立即拒绝“pass短语”,因为它们可能非常强大,即使使用所有小写字母alpha。)此分析的可能副本存在严重缺陷:将第一个字母大写并在末尾添加1是使“密码强度”度量表满意的常见方法,它训练用户选择坏密码(我认为自己有安全意识,但在一段懒惰中,我为密码安全口令做了这件事。我正在想WTF吗?)在泄露的RockYou数据集中(似乎具有代表性),“Password1”(等级3502)是最常见的密码,带有A-Z、A-Z和0-9;"P@ssw0rd“(排名7772)是最常见的,还有一个额外的“特殊字符”。正如我所说的,这并不准确,只是一个估计。这是对最坏攻击场景的分析。据我所知,问题是“如果没有,最好的开始方式是什么?”。这怎么能帮不上你的忙呢?这是一个错误的估计,它会误导普通用户,并鼓励错误的想法——至少你需要估计一个好的密码破解者会做什么。OTOH,如果您担心在线攻击,那么过滤掉
rockyou-75.txt
中的所有内容可能就足够了(加上服务器端的速率限制)。如果您担心脱机攻击,生成安全的随机密码非常简单,通常比用户提供的密码要好得多(所谓“安全”是指,例如,
SecRandomCopyBytes()
)。仅仅腌制也是不够的;我推荐
scrypt()
bcrypt()