【问题标题】:Characters to avoid in automatically generated passwords自动生成的密码中要避免的字符
【发布时间】:2010-09-08 12:09:03
【问题描述】:

我需要生成一些密码,我想避免可能相互混淆的字符。是否有明确的我应该避免的角色列表?我目前的清单是

il10o8B3Evu![]{}

还有其他容易混淆的字符对吗?对于特殊字符,我将自己限制为数字键下的字符,尽管我知道这取决于您的键盘国籍!

作为一个骑手问题,我希望我的密码是“wordlike”的,你有一个喜欢的算法吗?

谢谢:)

【问题讨论】:

  • 很棒的帖子。 “il10o8B3Evu![]{}”! :-)
  • 您希望密码像单词并获得 18 票。你确实得到了安全概念的人是让密码很难猜到。
  • FWIW,我最终会说出我所有的密码,无论它们一开始多么不合时宜。刚刚生成了PJLUB7Cy——“PJ”(就像你睡觉时穿的一样)、“LUB”(我舔了我的小猫)、“7”、“Sigh”。如果你让自己一遍又一遍地输入它们,它们就会粘住。
  • 虽然肯定要避免使用“l”和“I”,但我认为“L”和“i”没有问题。

标签: security passwords user-experience


【解决方案1】:
function random_readable_pwd($length=12){
    // special characters
    $sym="!\"§$%&/()={[]}\,.-_:;@>|";

    // read words from text file to array
    $filename="special.txt";
    if (!file_exists($filename)) { die('File "'.$filename.'" is not exists!'); }
    $lines = file($filename);
    foreach ($lines as $line_num => $line) {
        $line=substr($line, 0, -2);
        $words[].=$line;
    }

    // Add words while password is smaller than the given length
    $pwd = '';
    $ran_date=date("s");
    while (strlen($pwd) < $length){
        $r = mt_rand(0, count($words)-1);
        // randomly upercare word but not all in one time
        if ($ran_date % 3 == 0) $words[$r]=ucwords($words[$r]);
        $pwd .= $words[$r];
        //randomly add symbol
        if ($ran_date % 2 == 0) $pwd .= $sym{mt_rand(0,strlen($sym))};
        $ran_date++;
    }

    // append a number at the end if length > 2 and
    // reduce the password size to $length
    $num = mt_rand(1, 99);
    if ($length > 2){
        $pwd = substr($pwd,0,$length-strlen($num)).$num;
    } else { 
        $pwd = substr($pwd, 0, $length);
    }

    return $pwd;

}

【讨论】:

  • 欢迎来到 Stack Overflow!请在你的回答中加入一些介绍或总结,并尽量限制代码片段的大小。
【解决方案2】:

我首选的方法是获取 3、4 和 5 个字母单词的单词列表。然后选择其中至少 2 个,并在每个单词之间放置一个随机的 2 位数字或特殊符号 (%&*@#$)。如果您愿意,每个单词最多可以随机大写一个字符。

根据您的强度要求,您最终会得到易于记忆和交流的密码,例如:

  • lemon%desk
  • paper&boy32hat

请记住,您偶尔会遇到有趣或不恰当的单词组合(我会让您发挥想象力)。如果不喜欢所提供的密码,我通常有一个按钮允许生成新密码。

通常,只使用人们通常知道其名称的符号。在美国标准键盘上,我会避免使用 ~`'/\^

我想这比您的主要问题更能回答您的骑手问题。 ..

祝你好运!

【讨论】:

  • James,你的答案依赖于 PHP 的 rand() 函数,它不是一个安全的随机数生成器。
  • 非常正确,脚本更多地是作为“模型”给出的,而不是具体的解决方案。
  • 这也是极其不安全的,因为密码破解工具精确地使用字典单词和随机特殊字符的组合来猜测密码。
  • 让我想起了 Compuserve 密码。我仍然记得我的。锥度?工人
【解决方案3】:

在我(电气工程,技术)研究生院中,所有计算机帐户都使用密码进行初始化,我认为这些密码是由标准 linux 实用程序生成的。它们由三个随机音节组成,每个音节中有三个小写字母。结果是相当安全的(大约有数十亿种可能的组合),但又如此清晰,以至于我在十多年后仍然使用其中的一些密码。 James 的例子很好地证明了这一点。

网络安全专家对密码的一般评论:它们很糟糕,有几个原因,包括:

  • 通常很容易破解,无论是通过社会工程还是使用攻击软件,特别是如果您对目标了解任何信息

    示例 1: 我最近需要修改受密码保护的技术文档。看着日期,我知道当时我们的驻地技术作家是谁,输入了我脑海中的第一个词,然后立即解锁了文件。

    示例 2: 标准密码破解程序允许破解者指定一组对用户提供的字典进行操作的规则。用$ymb01$替换某些字母,或者翻译成1337等很简单。

  • “安全”密码不是。鉴于大多数人需要记住的密码数量之多,“记住”像“a4$N!8_q”这样的“强”密码的最常见方法是将其写在一张纸上(或者更糟的是,将其存储在一个文本文件)。 '纳夫说。

如果您需要真正的安全身份验证,多因素(或双因素)是行业认可的机制。 “两个因素”通常是您拥有的东西(例如访问卡)和您知道启用它的东西(例如 PIN)。没有另一个,两者都不能工作——你需要两者。

另一方面,请考虑您真正需要的安全级别。你在保护什么? “坏人”想要得到它有多严重,如果他们这样做了会有什么后果?机会是,“Its@Secret!”绰绰有余。 :-)

【讨论】:

  • 如果你有兴趣,密码是大写 Y 的“Yahweh”。我也不是通灵者。如果您与我们的技术作家进行了 5 分钟的对话,您也会猜到的——首先尝试一下。
【解决方案4】:

一种起始方法可能是生成大部分有效的英语音节,将它们混合,然后进行 text->l33t 转换。已经对世代自然语言语法进行了研究,因此其中一项可能会有所帮助。

例如啊 ul ing 都是有效音节或接近它...混合它们-> Ingulah...l33t 它-> 1ngu4h。它是最好的吗?不。但至少它是半发音的(如果你说 l33t)并且在计算上更安全。

【讨论】:

    【解决方案5】:

    几年前,对于一个国际客户,我必须生成随机的安全密码,然后我的客户将这些密码邮件合并到文档中,然后通过邮寄方式发送给 40 个国家/地区的收件人。由于不知道文档中要使用什么字体,我使用了一个字符列表,例如 Steve Gibson 64-character 集来消除相似字形之间的混淆。

    为了使生成的密码更易读,从而更容易记住,我将辅音和元音配对在一起,并添加了一些辅音有向字母(sh、th、wh 等)。

    为了减少生成不当或冒犯性词语的机会(以英语或接收者的语言),我将连续的字母字符限制为两个,其间为数字或标点符号:

    Es4tU$sA6
    wH@cY8Go2
    

    现在回顾我的方法,我意识到不适当性算法还有改进的余地。仅使用上面的规则,现在可以使用一些数字和标点符号代替字母。

    【讨论】:

      【解决方案6】:

      对于人类可读的密码,我最近使用了一个与下面的非常相似的 PHP 脚本。它运作良好。诚然,密码不会非常安全(因为它们容易受到字典攻击),但对于可记忆或至少可读的密码来说,它工作得很好。但是,这个函数不应该按原样使用,它更多的是为了说明而不是其他任何东西。

      function generatePassword($syllables = 2, $use_prefix = true)
      {
      
          // Define function unless it is already exists
          if (!function_exists('arr'))
          {
              // This function returns random array element
              function arr(&$arr)
              {
                  return $arr[rand(0, sizeof($arr)-1)];
              }
          }
      
          // Random prefixes
          $prefix = array('aero', 'anti', 'auto', 'bi', 'bio',
                          'cine', 'deca', 'demo', 'dyna', 'eco',
                          'ergo', 'geo', 'gyno', 'hypo', 'kilo',
                          'mega', 'tera', 'mini', 'nano', 'duo',
                          'an', 'arch', 'auto', 'be', 'co',
                          'counter', 'de', 'dis', 'ex', 'fore',
                          'in', 'infra', 'inter', 'mal', 
                          'mis', 'neo', 'non', 'out', 'pan',
                          'post', 'pre', 'pseudo', 'semi',
                          'super', 'trans', 'twi', 'vice');
      
          // Random suffixes
          $suffix = array('dom', 'ity', 'ment', 'sion', 'ness',
                          'ence', 'er', 'ist', 'tion', 'or',
                          'ance', 'ive', 'en', 'ic', 'al',
                          'able', 'y', 'ous', 'ful', 'less',
                          'ise', 'ize', 'ate', 'ify', 'fy', 'ly'); 
      
          // Vowel sounds 
          $vowels = array('a', 'o', 'e', 'i', 'y', 'u', 'ou', 'oo', 'ae', 'ea', 'ie'); 
      
          // Consonants 
          $consonants = array('w', 'r', 't', 'p', 's', 'd', 'f', 'g', 'h', 'j', 
                              'k', 'l', 'z', 'x', 'c', 'v', 'b', 'n', 'm', 'qu');
      
          $password = $use_prefix?arr($prefix):'';
          $password_suffix = arr($suffix);
      
          for($i=0; $i<$syllables; $i++)
          {
              // selecting random consonant
              $doubles = array('n', 'm', 't', 's');
              $c = arr($consonants);
              if (in_array($c, $doubles)&&($i!=0)) { // maybe double it
                  if (rand(0, 2) == 1) // 33% probability
                      $c .= $c;
              }
              $password .= $c;
              //
      
              // selecting random vowel
              $password .= arr($vowels);
      
              if ($i == $syllables - 1) // if suffix begin with vovel
                  if (in_array($password_suffix[0], $vowels)) // add one more consonant 
                      $password .= arr($consonants);
      
          }
      
          // selecting random suffix
          $password .= $password_suffix;
      
          return $password;
      }
      

      【讨论】:

        【解决方案7】:

        我不喜欢单词列表的方法。例如,在 OSX 上的 /usr/share/dict/words 中,有 5110 个 4 字符的单词。将其中两个与分隔符一起使用会产生约 600M 的组合。但是,如果您直接将字符集与强随机数生成器一起使用,您将拥有 88^9 种可能的密码,3.16e+17 种组合。

        无论哪种方式,针对该系统的可能攻击都将针对随机数生成器,因此请确保您使用的是加密能力强的生成器。如果使用 PHP 的标准 rand 函数,它会通过注册和重置数千个密码来进行攻击,以采样 RNG 状态,然后预测剩余的 RNG 状态,这将减少攻击者需要测试的可能密码的数量。

        【讨论】:

          【解决方案8】:

          阅读Choosing Secure Passwords

          这里有一个有趣的花絮:要获得更安全的密码,请确保一些数字和特殊字符出现在中间。破解程序会在开始时检查它们并尽快结束。

          【讨论】:

            【解决方案9】:

            作为另一种选择,您可以使用等宽/终端字体(如 courier)来打印密码。这样相似的字符应该更容易区分。

            【讨论】:

              【解决方案10】:

              以下是 Steve Gibson 用于他的"Perfect Paper Password" 系统的字符集。它们是“允许的字符”而不是“要避免的字符”,但对于您想要的,它们似乎很合理:

              一组标准的 64 个字符

              !#%+23456789:=?@ABCDEFGHJKLMNPRS
              TUVWXYZabcdefghijkmnopqrstuvwxyz
              

              更大的 88 个字符集

              !"#$%&'()*+,-./23456789:;<=>?@ABCDEFGHJKLMNO
              PRSTUVWXYZ[\]^_abcdefghijkmnopqrstuvwxyz{|}~
              

              对于可发音的密码,我不熟悉算法,但您可能希望以 APGpwgen 为起点。

              【讨论】:

              • 我接受了这个答案,因为它确认有限的字母表是正确的方法:) 我不同意哪些是正确的字母(我现在也将排除 D!)另一个答案说使用更好的字体,这是明智的建议,但对于网络应用程序并不总是可行的。谢谢大家:D
              • 不知道为什么第二组包含O,但1、I、l都不包含。
              【解决方案11】:

              要添加到 Jim 的答案,您还可以使用单词列表并用符号随机替换某些字符(@ 表示 A,0(零)表示 O 或 5 表示 S)和/或删除元音从字面上看。

              • lmn%Desk
              • p@per&b0y32H@t

              仍然主要是人类可读的。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2013-07-12
                • 2021-02-22
                • 1970-01-01
                • 2018-03-13
                • 1970-01-01
                • 1970-01-01
                • 2016-08-22
                • 2014-02-05
                相关资源
                最近更新 更多