使用表情符号可以使某人的密码更安全吗?

信息安全 密码 蛮力 密码破解
2021-08-12 04:11:59

前几天我只是在考虑这个问题,在阅读了有关制作安全密码的内容后,您有几个选择:

第一个是,添加数字,或者不仅仅是一个单词

Password15068 或 Pa55w0rd15068 或 Passw0rd15068

但我相信普遍的共识是,你得到的 L337 说话越随机,就越难记住。

我读到的下一个方法是取 4-5 个单词并将其组合成一个短语或一个单词,比如说我们的 5 个单词是“dog”“walks”“in”“the”“yard”。可能的密码可能是:

狗在院子里散步或 Dowainthya 或其他一些杂乱无章的组合......

但这提出了同样难以记住的问题。所以这让我开始思考,我不认为我会这样做,但是破解软件是否先进到足以假设表情符号是 1 个字符?或者它会用 unicode 读出它吗?另一件事是说我使用这个表情符号:💰 这会生成此代码,xn--ss8h那么密码“Password💰”是否会被读取为 9 个字母/数字?还是17?

密码💰 或 Passwordxn--ss8h

如果它被读取为 unicode,那将增加额外的字母数量,让破解者不得不猜测。(假设它是蛮力攻击)。即使在 BF 破解者找到密码的Passwordxn--ss8h情况下,在密码槽中输入密码也不会让您登录,因为它不是匹配的表情符号?

这显然是一种理论上的情况,我认为我实际上不会容忍这种情况,但我认为它在将来肯定会有所帮助,而不是happyfacemoneybags你可以使用的密码:😁💰或者xn--ss8h7u但系统只会让你登录如果正确的图标在插槽中。


更新 1

这是指通过密码检查器运行可能的密码。

控制密码hellohello

hellohello生成分数:0%和“非常弱”的复杂性

需要注意的一些关键事项:

  • 由于长度,我获得了 +40 的奖励
  • 由于只有字母,连续小写和重复单词,我总共被扣除了-52

💰hellohello生成的分数为:42%,复杂度为"good"

需要注意的一些关键事项:

  • 由于符号、小写字母和长度,我获得了 +64 的奖励
  • 由于连续的小写和重复单词,我总共被扣除了-24

💰HelloHello生成分数:80%和复杂性"very strong"

需要注意的一些关键事项:

  • 由于符号、小写字母、大写字母和长度,我获得了 +94 的奖励
  • 由于连续的小写和重复单词,我总共被扣除了-18

💰HeLLoHeLLo生成分数:88%和“非常强”的复杂性

需要注意的一些关键事项:

  • 由于符号、小写、大写和长度,我获得了 +98 的奖励
  • 由于连续的小写和重复单词,我总共被扣除了-10

基于此密码,显然添加符号💰使其更加安全,但我不确定此密码检查器基于什么算法。

4个回答

破解密码的难度是通过生成密码的过程中的熵来衡量的。对于大多数密码,这可以通过将符号数的以 2 为底的对数提高到所用符号数的幂来衡量。例如,由 8 个小写字母组成的随机选择的密码中包含log2(26 ^ 8) ~ 38一些熵。

这种方法可以扩展到“正确的马电池订书钉”式密码。在这种情况下,每个单词本身就是一个符号,是从包含 10,000 个最常用单词的字典中选择的。以这种方式随机生成的密码会有log2(10,000 ^ 4) ~ 53一些熵,并且更难破解。

希望通过查看这两个示例,您可以看到与适度增加指数相比,大幅增加基数对密码熵的影响要小得多。这很重要,因为通过添加可供选择的其他符号(大写字母、数字、符号,以及极端情况下的非拉丁 Unicode 代码点,如表情符号、RTL 标记、汉字等),您正在增加基础和不是指数。通常会使您的密码更难破解,甚至可能会让您更难忘,但增加长度(以及指数)会更有帮助。

例如,通过包含小写字母 (26)、大写字母 (26)、数字 (10)、常用符号 (32) 和一些表情符号(比如说 200,例如,为了),一个随机的八字符密码将具有log2(26 + 26 + 10 + 32 + 200) ^ 8) ~ 66一点点的熵。另一方面,简单地将仅由小写字母组成的密码的长度加倍会导致密码具有log2((26 ^ 16) ~ 75熵位,破解难度超过五百倍。

虽然添加表情符号可以使密码更强大,但它不如简单地增加长度那么有效。它不会把一个可怕的密码Password15068变成更难破解的东西。而且它在许多现实世界的密码输入字段中根本不起作用(有些人会直接拒绝它,更糟糕的是,许多其他人会默默地忽略该字符)。此外,像😁💰这样的两个字符的密码永远不会安全,原因很简单,只有少数表情符号可供选择;即使您假设其中有一万个,您也会留下一个只有log2(10,000 ^ 2) ~ 27一点熵的密码。

您最好的选择是简单地使用密码管理器人类不擅长记住复杂的密码,但计算机却很擅长。密码管理器为您访问的每个站点提供强大、唯一的密码,并从链中移除最薄弱的组件:人类。

更新:我在原帖中没有说清楚,但熵的线性增加代表破解难度的指数增加。具有n少量熵的密码2^(n-1)平均需要操作才能破解,因此熵每增加一,破解密码所需的努力就会加倍。

复杂密码的目的是防御暴力攻击。除非您是攻击者的直接目标,否则攻击者很可能只会尝试简单的密码及其排列(其中“简单”仍然涵盖数万个密码),然后转移到其他人身上。那些简单的密码通常基于常用(密码)单词的字典,而不仅仅是尝试所有可能的字符组合。目前,由于几乎没有人在密码中使用表情符号,因此使用它们可能会使您的密码独一无二,因此极不可能被破解(只要它以远程安全的方式存储),仅仅是因为它是晦涩难懂的。即使攻击者确实在他们的字典中添加了表情符号,unicode 中也有足够的表情符号,除非你选择像☺这样明显的东西,它仍然比您可能在密码中输入的大多数其他字符更强。所以是的,表情符号确实使您的密码更安全。

但是,如果您确实包含表情符号,这并不意味着您可以不遵循其他密码准则,尤其是在每个站点上使用不同的密码。有些网站违反所有最佳做法,以纯文本或可转换为纯文本的格式存储用户密码。如果您在任何地方都使用相同的密码,并且其中一个网站遇到了安全漏洞,那么在该密码中包含表情符号的好处将完全为零,因为攻击者现在可以登录其他网站。

另一件事是说我使用这个表情符号:💰这会生成此代码xn--ss8h,那么密码“Password💰”是否会被读取为 9 个字母/数字?还是17?

除非您的密码所用于的服务正在做奇怪的事情,否则它将是 9 或 13 个字符,具体取决于所使用的攻击。xn-ss8h只是该字符的表示,以允许它在诸如 URL 之类的东西中使用,而实际上它只是一个数字。在十六进制中,该数字是0xF09F92B0,因此,如果攻击者确定要获取您的密码,他们会通过尝试每个字符(包括💰)来暴力破解它,或者他们会逐字节尝试(在这种情况下,它是0xF0, 0x9F, 0x92, 0xB0) .

如果我们假设 Randall Munroe 在此 XKCD 漫画中描述的方法就足够了,那么我们可以确定您需要多少个表情符号才能仅用表情符号来制作足够强的密码。事实证明,表情符号与文字非常相似。Unicode 标准中有3,178 个表情符号(约 11.6 位),而 Munroe 对每个单词的评分约为 11 位(2,048 个单词词典)。

tl; dr:“🤹🛠️🦝♐”至少和“马电池订书钉正确”一样好。

正如其他人所提到的,网站很可能会行为不端,要么不允许密码,要么不小心削弱密码。

免责声明:我不是密码学专家或任何其他人,但这是我尝试攻击此类事物的方法。

这显然是一种理论上的情况,我认为我实际上不会容忍这种情况,但我认为它在将来肯定会有所帮助,而不是密码 happyfacemoneybags 你可以使用:😁💰 或 xn--ss8h7u 但如果插槽中有正确的图标,系统只会让您登录。

我无法理解您的意思,“只有在插槽中有正确的图标时才会让您登录。”

除非表情符号仅作为小写字符输出,否则它可能只能通过延长密码来“帮助”。原因如下:

如果您的表情符号unicode reference输出xn--ss8h为 a string,即 all lower case,那么这意味着您不能使用 X、N、S 或 H。这样可以减少我破解密码所需的时间。

关于两个表情符号的密码,我几乎会立即破解它们,如果不是立即的话。

  1. 获取完整的表情符号列表
  2. 创建一个结构表/任何东西。这是一些 C++ 半伪代码。

    typedef struct EmojiDef {
        string face;    
        string value;   
    } EmojiDef,*pEmojiDef;
    
    static EmojiDef EmojiTab[]=
    {
         {"💰", "xn--ss8h"} // etc... 💰 would be the actual unicode value, whatever it is. xn--ss8h would be your formatting. 
    };
    
  3. 遍历table,并生成所有可能的密码。

  4. 使用生成的密码列表进行暴力攻击。
  5. 大肆破坏。

如您所见,这实际上可能会使情况变得更糟,尤其是在两个表情符号的情况下。它们可以很容易地在结构表中表示。由于您通过将它们全部删除来删除几个可能的字符lower case,因此它可能会更容易。

我目前不确定是否有编程语言允许您在lower case、 或upper case、 或中创建 unicode 引用mixed case,但在您的示例中,我相信您正在减去执行成功蛮力所需的字符数武力攻击。让我尝试更好地解释它:

xn-ss8h7u不可能xN-sS8h7u,可以吗?可以XN-SS-8h7u吗?如果在引用 emoji unicode 时只能使用小写字符,那你就完蛋了!

更新

如果我的密码是💰hello,我只能使用 💰hello 访问它,使用 xn--ss8hhello 不会让我登录。所以让我们考虑一下

还记得结构表吗?那只是为了将 unicode 字符转换为您的字符串输出。我仍然会使用数组比较循环非常快速地破解低字符表情符号。

更新 2

现在我明白你的意思了......但如果你像这样介绍每个表情符号,你也可能会减少测试所需字符的数量。每个表情符号都可以作为单个字符串测试引用,但有数千个,因此如果您使用表情符号、混合大小写等的组合,您实际上会大大提高密码的强度。对于简单的密码,这仍然是非常容易破解的。您只需将结构表更改为数组/列表,然后插入每个引用,然后循环遍历它,并尝试将其附加到弱密码。像这样愚蠢的东西:

for (int i = 0; i < emoji; i++)
{
    if (checkPassword(emoji[i] + dict[i]) { writeFound(emoji[i] + dict[i]); } // check either side, etc. 
}

更新 3

💰hellohello 的得分为:42%,复杂度为“好”。

💰HelloHello 生成的分数为:80%,复杂度为“非常强”。

💰HelloHello 生成的分数为:80%,复杂度为“非常强”。

💰HeLLoHeLLo 生成的分数为:88%,复杂度为“非常强”。

将一个string array表情符号(之前或之后)与暴力表中的错误密码进行比较,得出的分数是:您的所有密码在一小时或更短的时间内被破解。试试这个:

  • 表情符号 + 密码错误
  • 密码错误 + 表情符号

...将通过 unicode 引用加上错误密码(之前或之后)的字符串连接很快被击败,反对输入。

结论

是的,我相信是这样,但前提是与典型的密码最佳实践结合使用,并且使用多个密码。那时,很多人建议改用密码管理器。

也许有更多知识的人应该加入,但乍一看我不会相信这个系统的几个部分,特别是如果你想使用两个表情符号密码。甚至连续 10 或 20 个。这基本上变成了以数组表示的数字集合,而基于数字的较小密码是最不安全且易于破解的密码之一。