【问题标题】:Password strength library - Objective C密码强度库 - Objective C
【发布时间】:2013-02-18 11:39:13
【问题描述】:

我正在寻找一个可以估计密码强度的开源组件。 在网上搜索,我发现这很有趣:https://github.com/lowe/zxcvbn(以及有关它的更多详细信息:https://tech.dropbox.com/2012/04/zxcvbn-realistic-password-strength-estimation/)。

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

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

【问题讨论】:

  • 从引用的项目中窃取单词表并重写代码? (请注意,一个好的密码强度评估器不应拒绝“密码短语”,因为它们可能非常强大,即使是所有小写字母。)

标签: iphone ios objective-c macos passwords


【解决方案1】:

所以,终于,在一年多之后,伟大的 Mattt Thompson 刚刚在 GitHub 上发布了他自己的密码强度验证库、验证规则以及强度评估。

这里是:https://github.com/mattt/Navajo

【讨论】:

    【解决方案2】:

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

    https://github.com/dropbox/zxcvbn-ios

    【讨论】:

    • 这不回答具体问题;作为评论会更有意义。
    【解决方案3】:

    除了在密码中包含可能使其容易受到字典攻击的实际英文单词之外,您还可以将其简单地分析为它对纯暴力攻击的抵抗力。

    检查字典攻击的安全性必须使用一个大的词表。我还必须考虑实际的字典攻击是如何工作的,并混合字典单词,以及它们是否会发生变化,比如将 A 换成 4 等。

    让我们专注于暴力攻击,我相信我可以帮助你。

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

    在只有小写字母(大约有 25 个,取决于语言)和 N 个字符的密码的情况下,您将有 25 次方的 N 个不同组合。因此,例如一个小写的 6 个字母密码有 244140625 种不同的可能性。

    现在让我们添加大写字母,再添加 25 个(总共 50 个)。对于 6 个字母的密码,我们将得到 50 的 6 次组合的幂,即 15625000000。

    添加一些数字?所以还有 10 个字符。

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

    所以基本上你要做的就是分析一个密码并检查它是否有小写字母(可能总是),所以你将 25 添加到字符集计数。 它有大写字母吗?再算上25个。 它有数字吗?再数10个。 它还有其他符号吗?再数 20 个。

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

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

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

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

    让我们假设 MD5。对于 MD5,我发现了这个 http://bvernoux.free.fr/md5/index.php,它表示每秒检查 2 亿个哈希值。

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

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

    要检查的另一件重要事情是密码散列是否使用了盐。使用盐存储密码(http://en.wikipedia.org/wiki/Salt_(cryptography))是当今的一种常见做法。如果您不使用这种方法,那么您很容易受到彩虹表攻击(http://en.wikipedia.org/wiki/Rainbow_table),在这种情况下,所有这些数学运算都是无用的,因为您的密码非常不安全,字符数非常高(16 个左右)计算了哪些彩虹表。

    希望对你有帮助!

    【讨论】:

    • 这个分析有很大的缺陷: 将第一个字母大写并在末尾添加 1 是一种非常常见的“密码”方法强度”米快乐,它训练用户选择错误的密码(我认为自己有安全意识,但出于懒惰,我这样做是为了密码安全密码。WTF我在想吗?)。在泄露的 RockYou 数据集(似乎具有代表性)中,“Password1”(排名 3502)是最常见的密码,包含 A-Z、a-z 和 0-9; “P@ssw0rd”(排名 7772)是最常见的附加“特殊字符”。
    • 正如我所说,它不准确,它只是一个估计。这是对最坏攻击场景的分析。据我所知,问题是“如果没有,最好的开始方式是什么?”。这对至少形成自己制定方法的心态没有帮助吗?
    • 这是一个错误的估计,会误导普通用户并助长错误的心态——至少你需要估计一个好的密码饼干会做。 OTOH,如果您担心在线攻击,过滤掉rockyou-75.txt 中的所有内容可能就足够了(加上服务器端速率限制)。如果您担心离线攻击,生成 secure 随机密码很简单,通常比用户提供的密码好得多(“安全”我的意思是例如SecRandomCopyBytes())。仅仅加盐也是不够的;我推荐scrypt()bcrypt()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 2011-03-08
    • 2011-08-26
    相关资源
    最近更新 更多