Символы, которых следует избегать в автоматически генерируемых паролях

StackOverflow https://stackoverflow.com/questions/55556

Вопрос

Мне нужно сгенерировать несколько паролей, я хочу избегать символов, которые можно спутать друг с другом.Есть ли окончательный список персонажей, которых мне следует избегать?мой текущий список

il10o8B3Еву![]{}

Есть ли еще пары символов, которые легко спутать?для специальных символов я собирался ограничиться теми, которые находятся под цифровыми клавишами, хотя я знаю, что это зависит от национальности вашей клавиатуры!

В качестве вопроса: я бы хотел, чтобы мои пароли были «словообразными». Есть ли у вас для этого любимый алгоритм?

Спасибо :)

Это было полезно?

Решение

Вот наборы символов, которые Стив Гибсон использует для своих «Идеальный бумажный пароль» система.Это «символы, которые следует разрешить», а не «символы, которых следует избегать», но они кажутся вполне разумными для того, что вы хотите:

Стандартный набор из 64 символов.

!#%+23456789:=?@ABCDEFGHJKLMNPRS
TUVWXYZabcdefghijkmnopqrstuvwxyz

Большой набор из 88 символов.

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

Что касается произносимых паролей, я не знаком с алгоритмами, но вы можете посмотреть ПНГ и pwgen в качестве отправной точки.

Другие советы

Мой предпочтительный метод — получить список слов из 3, 4 и 5 букв.Затем выберите как минимум 2 из них и поместите между каждым словом случайное двухзначное число или специальный символ (%&*@#$).Если вы хотите, вы можете произвольно использовать до одного символа в слове.

В зависимости от ваших требований к надежности вы получите легко запоминающиеся и передаваемые пароли, например:

  • лимон%стол
  • бумага&мальчик32шапка

Имейте в виду, что иногда вы получаете интересные или неуместные сочетания слов (я позволю вам использовать свое воображение).Обычно у меня есть кнопка, позволяющая сгенерировать новый пароль, если представленный не нравится.

Как правило, используйте только те символы, названия которых людям известны.На стандартной клавиатуре США я бы избегал ~`'/\^

Я думаю, это больше ответило на ваш вопрос о гонщике, чем на ваш главный вопрос...

Удачи!

Читать Выбор безопасных паролей.

Оттуда один интересный момент:Чтобы пароли были более безопасными, убедитесь, что в середине находятся цифры и специальные символы.Программы для взлома проверяют их в начале и заканчивают раньше.

Чтобы дополнить ответ Джима, вы также можете использовать список слов и случайным образом заменить определенные символы символами (@ для A, 0 (ноль) для O или 5 для S) и/или удалить гласные из слов. .

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

По-прежнему в основном читаемый человеком.

В качестве другого варианта вы можете использовать моноширинный шрифт/шрифт терминала, например Courier, для печати паролей.Таким образом, похожие персонажи должны быть намного более различимы.

Несколько лет назад для международного клиента мне пришлось создать случайные безопасные пароли, которые затем были объединены моим клиентом в документы и отправлены по почте получателям в 40 странах.Не зная, какой шрифт будет использоваться в документах, я использовал список символов, например шрифт Стива Гибсона. 64 символа установлен, чтобы исключить путаницу между похожими глифами.

Чтобы полученные пароли можно было произносить и, следовательно, их было легче запомнить, я соединил согласные и гласные вместе, добавив в смесь несколько орграфов согласных (sh, th, Wh и т. д.).

Чтобы уменьшить вероятность создания неуместных или оскорбительных слов (на английском языке или на языках получателей), я ограничил количество последовательных буквенных символов двумя, а между ними располагались цифры или знаки препинания:

Es4tU$sA6
wH@cY8Go2

Оглядываясь сейчас на свой метод, я понимаю, что в алгоритме определения несоответствия есть возможности для улучшения.Используя только приведенные выше правила, теперь возможны некоторые оскорбительные слова, поскольку некоторые цифры и знаки препинания заменены буквами.

Для удобочитаемых паролей я недавно использовал 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;
}

В моей аспирантуре (электротехник, технический специалист) все учетные записи компьютеров инициализировались паролями, которые, как я полагаю, были сгенерированы стандартной утилитой Linux.Они состояли из трех случайных слогов, по три строчных буквы в каждом слоге.Результат оказался достаточно безопасным (порядка миллиардов возможных комбинаций), но при этом настолько легко произносимым, что я до сих пор использую некоторые из этих паролей более десяти лет спустя.Пример Джеймса является прекрасной демонстрацией этого.

Комментарий к паролям в целом от специалиста по сетевой безопасности:они ужасны по нескольким причинам, в том числе:

  • Как правило, его легко взломать либо с помощью социальной инженерии, либо с помощью атакующего программного обеспечения, особенно если вы знаете что-либо о вашей цели.

    Пример 1: Недавно мне нужно было пересмотреть технический документ, защищенный паролем.Глядя на дату, я знал, кто в то время был нашим техническим писателем, напечатал первое слово, которое пришло мне в голову, и немедленно разблокировал документ.

    Пример 2: Стандартные программы для взлома паролей позволяют взломщику указать набор правил, которые действуют на основе словаря, предоставленного пользователем.Заменить определенные буквы на $ymb01$ или перевести их на 1337 и т. д. нетрудно.

  • «Безопасные» пароли — нет.Учитывая огромное количество паролей, которые большинству людей необходимо запомнить, наиболее распространенный способ «запомнить» «надежный» пароль, такой как «a4$N!8_q», — это записать его на листе бумаги (или, что еще хуже, сохранить его в текстовый файл).'Достаточно.

Если вам действительно нужно безопасный аутентификация, многофакторный (или двухфакторный) — это общепринятый в отрасли механизм.«Два фактора» — это обычно то, что вы иметь (например, карта доступа) и что-то, что вы знать который включает его (например, PIN-код).Ни один из них не работает без другого — вам нужны оба.

С другой стороны, подумайте, какой уровень безопасности вам действительно нужен.Что ты защищаешь?Насколько сильно «плохие парни» хотят это получить и каковы последствия, если они это сделают?Скорее всего, "это@секрет!" достаточно, чем достаточно хорошо.:-)

Мне не нравится подход со списком слов.Например, в /usr/share/dict/words в OSX имеется 5110 4-значных слов.Использование двух из них с символом-разделителем дает около 600 миллионов комбинаций.Но если бы вы использовали набор символов напрямую с сильным генератором случайных чисел, у вас было бы 88^9 возможных паролей, 3,16e+17 комбинаций.

В любом случае, вероятная атака на эту систему будет направлена ​​на генератор случайных чисел, поэтому убедитесь, что вы используете криптостойкий генератор.Если вы используете стандартную функцию PHP rand, она будет атакована путем регистрации и сброса тысяч паролей для выборки состояния RNG, а затем прогнозирования оставшегося состояния RNG, что уменьшит количество возможных паролей, которые злоумышленнику необходимо проверить.

Начальным подходом может быть создание наиболее допустимых английских слогов, их смешивание, а затем преобразование text->l33t.Была проделана работа над грамматиками естественного языка поколений, так что одна из них может помочь.

Например.ах ул инг — все допустимые слоги или близкие к этому...смешать их -> Ингула...л33т это -> 1нгу4х.Это лучшее, что есть?Неа.Но, по крайней мере, оно полупроизносимо (если вы говорите на l33t) и более безопасно в вычислительном отношении.

Если вы заинтересованы в создании произносимых паролей, есть порт C# по адресу:http://www.hoogervorst.ca/arthur/?attachment_id=1708

В коде вы найдете полезные ссылки, позволяющие узнать больше.http://www.multicians.org/thvv/gpw.html

Удачи.Джеймс

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;

}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top