Генератор паролей с обфускацией результата
Пользователи интернета все чаше становяться участниками различных ресурсов. Будь то форум, социальная сеть, блог, почта, свой сайт и многое другое. В частности почты, у человека может быть много почтовых ящиков. У меня, например, их 4. А еще может быть несколько форумов, сайтов и прочее. Поэтому приходится придумывать кучу паролей, а они должны быть надежными, а это ведь так лень
В сети можно найти кучу генераторов паролей, которые генерируют хорошие пароли, но... они сложные и их трудно запомнинать. Если пароль до 8 символов, то используя его несколько дней подряд еще можно запомнить, а что делать с длинными? Например, когда у меня стырили пароль от аськи (я его успел сменить), поставил другой, сгенерированный из разного набора символов. Т.к. я пароль от аськи больше не сохраняю, я его запомнил на третий день.
А как быть с другими сервисами, где пароли длиннее (например: у меня на почте стоит 20 символьный пароль из "каши", я его даже не пытаюсь запомнить. Может это и перебор, но пусть будет перебор). Для легкого запоминания пароля и в тоже время, не теряя надежности, был придуман фонетический алгоритм. Кем и когда я не знаю, инфу в сети по нему не нашел. Мне про него рассказал друг, когда в колледже вместе учились.
Фонетический алгоритм
Цель фонетического алгоритма состоит в том, чтобы чередовать гласные и согласные символы. В результате получаются слова похожие на диалект какого нибудь африканского племени. Например "posodume", можно прочитать как "позодумэ". С одной стороны получается произвольный набор символов, а с другой вполне понятные слова, которые к тому же можно легко запомнить. В алгоритме используются симолы латинского алфавита, согласные 'bdghklmnprstz' и гласные 'aeiou'. Символы 'cfjqvwx' и 'y' не используются, так как не позволяют создать звучные слова с их участием.
"Обфускация"
Взято в кавычки не просто так, изначально это слово подразумевает запутывание кода для невозможности дизассемблирования. Как правило, после дизасма код заново не скомпилится. Здесь обфускация обозначает замену некоторых символов на их числовые или знаковые эквивеленты с сохранением смысла. Например букву "i"
можно написать как "!", как бы перевенута. Таким образом, замена слудующих букв будет соответсвовать: b=6, g=9, l=1, s=5, t=7 и z=2 для согласных, a=4 (хотя эту комбинацию можно оспорить), e=3, i=! и o=0 для гласных. Для остальных замену я не искал.
Листинг 1. Код кнопки "Генерировать".
... implementation uses passwdgen; // Не забываем подключить модуль ;) ... procedure TForm1.Button1Click(Sender: TObject); var i: Integer; CountPass: Integer; LenPass: Integer; begin Memo1.Clear(); CountPass := StrToInt(EditCountPass.Text); // Количество паролей LenPass := StrToInt(EditLenPass.Text); // Длина паролей // Выключаем Мемо, что бы не грузить проц лишними вычислениями Memo1.Lines.BeginUpdate(); // Если стоит галка "Обфускация", то делаем ее. for i := 0 to CountPass do Memo1.Lines.Add(GetPassword(LenPass, CheckBoxObfus.Checked)); // После обновления влючаем Memo1.Lines.EndUpdate(); end;
EditCountPass - TEdit, для количества паролей и EditLenPass - TEdit, для длины пароля.
Листинг 2. Код модуля генерации.
unit passwdgen; interface const PatternSymbols1 = 'bdghklmnprstz'; PatternSymbols2 = 'aeiou'; PatternObfus1 = '691572'; PatternObfus2 = '43!0'; function GetPassword(ALengthPasswd: Integer; AObfus: Boolean = false): String; implementation function GetPassword(ALengthPasswd: Integer; AObfus: Boolean = false): String; var l: Integer; // Для цикла Pat1: String; // Для списка согласных Pat2: String; // Для списка гласных CountSym1: Integer; // Для количества используемых символов CountSym2: Integer; begin // Очистка SetLength(Result, ALengthPasswd); l := 1; // Если не установть эту переменную в еденицу, могут возникнуть баги :) Pat1 := PatternSymBols1; // Заносим строку согласных Pat2 := PatternSymBols2; // Заносим строку гласных // Рандом Вкл. Randomize(); if (AObfus) then begin // Если выбрали "обфускацию", то прибавляем и "обфусцированные" символы Pat1 := Pat1 + PatternObfus1; // Согласные Pat2 := Pat2 + PatternObfus2; // Гласные end; // Получаем длины получившихся строк CountSym1 := Length(Pat1); // Длина согласных CountSym2 := Length(Pat2); // Длина гласных // Пока количество символов, меньше уазанной длины пароля while (l <= ALengthPasswd) do begin // +1 нужен! Потому что, в компании Borland решили сделать индексы строковых // типов начинающиеся не с нуля, а с еденицы. А первый символ хранить длину // строки. // подробней <http://www.vr-online.ru/content/string-chego-ty-mog-i-ne-znat-299> Result[l] := Pat1[Random(CountSym1) + 1]; // Записали согласный Inc(l); // Переходим к следующему символу Result[l] := Pat2[Random(CountSym2) + 1]; // Записываем гласный Inc(l); // Еще раз переходим end; end; end.
А интерфейс у меня получился такой:

Заключение
Код разумеется не обладает соответствующими проверками. Его еще можно расширить,
но это выходит за рамки этой небольшой заметки. Также при "обфускации" Pat1 и
Pat2 можно составить полностью, например '6d9hk1mnpr572' и '43!0u' соответсвенно.
Таким образом получится "полная обфускация". Также можно, и даже нужно, добавить
чередование строчных и заглавных букв.
Written by: psycho-coder
Скачать исходник:
| Вложение | Размер |
|---|---|
| souce_passgen.zip | 8.28 КБ |
- psycho-coder's блог
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
- 1794 просмотра



Комментарии
6 комментария(ев)Дата: ПТ, 24/12/2010 - 09:37
Я одно время пароли хранил на файле в мобильном телефоне в зашифрованном виде
Дата: ПТ, 24/12/2010 - 15:18
Неа. Можно посчитать надежность пароля, сгенерированного этим кодом, и сравнить с надежностью случайного пароля
Возьмем пароль в 8 символов, который будем бить брут форсом. Скажем, это пароль на архив.
Возьмем генератор, который делает случайный пароль из 26 латинских букв и 10 цифр. Количество вариантов пароля будет (26 + 10) ^ 8 что есть примерно 2,8 * 10^12. Сейчас обычный компьютер может перебирать пароли около 50 раз в секунду (если хороший компьютер, то можно выйти в сотни). По моим подсчетам полный перебор на таком компьютере займет около 1800 лет.
Чтобы удачно взломать этот архив, нужен компьютер в тысячи раз быстрее. Обычному человеку такое недоступно.
Возьмем этот генератор. С включеной обфускацией длина Pat1 будет 19 символов, а Pat2 будет 9 символов. Количество вариантов пароля здесь будет (19 ^ 4) * (9 ^ 4), что есть 855036081 (примерно 8,6 * 10^8). Время перебора на обычном компе будет примерно 6,5 месяцев, что вполне уже можно простому смертному хакнуть, если очень захотеть. Можно компьютер помощнее купить, старый еще использовать параллельно да и еще какой-нибудь... В общем, вполне ломаемо.
С почтовыми ящиками так быстро перебирать не получиться, поэтому, наверное, все ок. Но если взять такой пароль сам по себе и сравнивать с другими, то он будет очень ненадежным.
Дата: ПТ, 24/12/2010 - 21:04
количество символов уже давно не считается критерием хорошей безопасности, т.к. мощности вычислительных машин достаточно огромны - CUDA. Другое дело время обработки вводимого пароля. Не помню кем, но на сайте Cracklab об этом хорошо было написано.
Дата: СБ, 25/12/2010 - 06:32
Сейчас я их храню в блокноте))) (не путать с .txt)
Можно увеличить длину пароля. У этого алгоритма упор на удобозапоминаемость
Например? Что то я не совсем понял.
Дата: Пнд, 27/12/2010 - 04:30
Это нужно кому-то очень сильно насолить, чтобы тебя несколько месяцев брутили, предварительно еще достав хэш пароля. Для обычного же, рядового пользователя фонетический метод формирования пароля является отличным решением, дающим возможность их помнить (своя черепушка получше блокнота будет) при достаточной степени надежности.
При использовании псевдолитеров нужно несколько раз подумать, потому что это ухудшает запоминаемость. Поэтому при формировании пароля с использованием "обфускации" нужно следовать каким-то заранее определенным правилам. Например, заменять все i на !, а не какую-то отдельную из слова или заменять только первый или последний символы.
Дата: СБ, 08/01/2011 - 04:27
Небольшая корректировочка: в main.pas
в цикле нужно вести отчет не от 0, а от 1
for i := 1 to CountPass do
Иначе при желании получить 1 пароль, получаешь 2 и т.д.
А по поводу надежности пароля, я считаю 2,8 * 10^12 или 8,6 * 10^8 не имеет особого значения, потому что для человека осуществляющего брут неизвестно, какие символы не использует пользователь. А добавление к буквам и цифрам знаков препинания значительно увеличит время перебора.