Фонетически запоминающиеся алгоритмы генерации паролей - PullRequest
48 голосов
/ 09 марта 2009

Фон

Находясь в спортзале на днях, я работал с кодовым замком и понял, что было бы полезно мне как программисту. То есть моя комбинация - это три отдельных набора чисел, которые либо звучат одинаково, либо имеют какое-то другое отношение, облегчающее их запоминание. Например, 5-15-25, 7-17-2, 6-24-5. Эти примеры кажутся легко запоминающимися.

Вопрос

Как бы я реализовал нечто подобное для паролей? Да, их должно быть трудно взломать, но они также должны быть простыми для запоминания конечным пользователем. Комбинированные замки делают это с помощью комбинации чисел с похожими звуками и чисел с похожими свойствами (7-17-23: все простые, 17 выпадают сразу после языка, а 23 - другое простое, и есть из этого набора), «жесткий», чтобы запомнить).

Критерии

  • Пароль должен быть легко запоминающимся. Dog!Wolf легко запомнить, но как только злоумышленник узнает, что ваш веб-сайт выдает эту комбинацию, его становится намного проще проверять.
  • Слова или буквы должны в основном следовать тем же звукам (по большей части).
  • Не менее 8 букв
  • Не использовать !@#$%^&*();'{}_+<>?,./ Эти знаки препинания, хотя и подходят для «жестких» паролей, не имеют звука, который легко запомнить.

Ресурсы

Этот вопрос не зависит от языка, но если есть конкретная реализация для C #, я был бы рад услышать об этом.

Обновление

Несколько пользователей сказали, что это плохая защита пароля. Не не предполагайте, что это для веб-сайта. Это может быть просто для меня, чтобы сделать приложение для себя, которое генерирует пароли в соответствии с этими правилами. Вот пример.

буквы * +1036 * A - C * +1039 * - C - L * тысяча сорок три * - * +1044 * I - M - O - P «поток», и они оказываются два обычные слова вместе взятые ( Акклимат и Швабра ). В дальнейшем, когда пользователь произносит эти буквы, или говорит их как слово, это актуально слово для них. Легко запомнить, но трудно взломать (атака по словарю, очевидно).

Этот вопрос состоит из двух частей:

  1. Создание паролей из букв, которые звучат одинаково (с использованием аллитерации) или
  2. Создайте пароли, которые объединяют общие слова аналогичным образом, чтобы создать третий набор букв, которого нет в словаре.

Ответы [ 17 ]

2 голосов
/ 09 марта 2009

Я полностью с RJH. Преимущество простого использования начальных букв парольной фразы состоит в том, что она выглядит случайной, что затрудняет ее запоминание, если вы не знаете фразу, стоящую за ней, в случае, если Ева смотрит через плечо, когда вы вводите пароль.
OTOH, если она увидит, что вы наберете около 8 символов, среди которых дважды 's', а затем 'o' и 'r', она может угадать это правильно с первого раза.
Принудительное использование хотя бы одной цифры на самом деле не помогает; вы просто знаете , что это будет "pa55word" или "passw0rd".

Тексты песен являются неисчерпаемым источником парольных фраз.

"But I should have known this right from the start"

становится "bishktrfts". 10 букв, даже только строчные, дают вам 10 ^ 15 комбинаций, что составляет много , тем более что для его взлома нет ярлыка. (При 1 миллионе комбинаций в секунду для проверки всех 10 ^ 15 комбинаций требуется 30 лет.)
В качестве дополнительного (в случае, если Ева знает, что вы фанат полиции), вы можете поменять местами, например. 2-ю и 3-ю букву или возьмите вторую букву третьего слова. Бесконечные возможности.

2 голосов
/ 09 марта 2009

Вот вторая часть вашей идеи, созданная в виде сценария оболочки. Он берет 4, 5 и 6 буквенных слов (примерно 50 000) из файла словаря Unix на вашем компьютере и объединяет эти слова в первый символ.

#! /bin/bash

RANDOM=$$
WORDSFILE=./simple-words
DICTFILE=/usr/share/dict/words
grep -ve '[^a-z]' ${DICTFILE} | grep -Ee '^.{4,6}$' > ${WORDSFILE}
N_WORDS=$(wc -l < ${WORDSFILE})
for i in $(seq 1 20); do
    password=""
    while [ ! "${#password}" -ge 8 ] || grep -qe"^${password}$" ${DICTFILE}; do
        while [ -z "${password}" ]; do
            password="$(sed -ne "$(( (150 * $RANDOM) % $N_WORDS + 1))p" ${WORDSFILE})"
            builtfrom="${password}"
        done
        word="$(sort -R ${WORDSFILE} | grep -m 1 -e "^..*${password:0:1}")"
        builtfrom="${word} ${builtfrom}"
        password="${word%${password:0:1}*}${password}"
    done
    echo "${password} (${builtfrom})"
done

Как и большинство генераторов паролей, я обманываю, выводя их по 20 штук. Это часто защищается с точки зрения «безопасности» (кто-то смотрит через ваше плечо), но на самом деле это просто хак, чтобы позволить пользователю просто выбрать самый дружелюбный пароль.

Я нашел слова из 4-6 букв из файла словаря, в котором все еще были неясные слова.

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

perl -pe 's/[^a-z]+/\n/gi' ./624425.txt | tr A-Z a-z | sort -u > ./words
ispell -l ./words | grep -Fvf - ./words > ./simple-words

Затем я использовал эти 500 или около того очень простых слов с этой страницы, чтобы сгенерировать следующие пароли с помощью сценария оболочки - сценарий в скобках показывает слова, составляющие пароль.

backgroundied (background died)
soundecrazy (sounding decided crazy)
aboupper (about upper)
commusers (community users)
reprogrammer (replacing programmer)
alliterafter (alliteration after)
actualetter (actual letter)
statisticrhythm (statistical crazy rhythm)
othereplacing (other replacing)
enjumbling (enjoying jumbling)
feedbacombination (feedback combination)
rinstead (right instead)
unbelievabut (unbelievably but)
createdogso (created dogs so)
apphours (applications phrase hours)
chainsoftwas (chains software was)
compupper (computer upper)
withomepage (without homepage)
welcomputer (welcome computer)
choosome (choose some)

Некоторые из результатов есть победители.

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

Генерация одного пароля в первый раз и каждый раз - то, что вам нужно для Интернета - потребует как лучшего источника данных, так и большей сложности. Использование лучшего языка программирования, чем Bash, с текстовыми файлами и использованием базы данных может заставить это работать мгновенно. Используя систему баз данных, вы можете использовать алгоритм SOUNDEX или что-то подобное.

Идеальная идея. Удачи.

1 голос
/ 09 марта 2009

Один из способов создать пароли, которые звучат как слова, - использовать цепочку Маркова. Цепочка Маркова с n-степенями - это в основном большой набор n-кортежей, которые появляются в вашем входном корпусе вместе с их частотой. Например, «aardvark» с цепью Маркова 2-й степени будет генерировать кортежи (a, a, 1), (a, r, 2), (r, d, 1), (d, v, 1) , (v, a, 1), (r, k, 1). При желании вы также можете включить «виртуальные» маркеры начальных и конечных слов.

Чтобы создать полезную цепочку markov для ваших целей, вы должны добавить большой массив данных на английском языке - их много, в том числе, например, Project Gutenburg, - для генерации набора записей, как описано выше. Для создания слов или предложений на естественном языке, которые, по крайней мере, в основном следуют правилам грамматики или композиции, обычно достаточно цепочки Маркова 3-й степени.

Затем, чтобы сгенерировать пароль, вы выбираете случайный «начальный» кортеж из набора, взвешенный по его частоте, и выводите первую букву. Затем многократно выбирайте случайным образом (снова взвешенный по частоте) «следующий» кортеж, то есть тот, который начинается с тех же букв, которыми заканчивается ваш текущий, и имеет только одну другую букву. Используя приведенный выше пример, предположим, что я начинаю с (a, a, 1) и выводю «a». Мой единственный следующий выбор - (a, r, 2), поэтому я вывожу еще один «a». Теперь я могу выбрать либо (r, d, 1), либо (r, k, 1), поэтому я выбираю один случайным образом в зависимости от частоты их появления. Предположим, я выбрал (r, k, 1) - я вывел 'r'. Этот процесс продолжается до тех пор, пока вы не достигнете маркера конца слова или не решите остановиться самостоятельно (поскольку большинство цепей Маркова образуют циклический граф, вы потенциально можете никогда не закончить генерацию, если не применяете искусственное ограничение длины).

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

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

1 голос
/ 09 марта 2009

Системные пароли являются плохой идеей для чего-либо, кроме внутренних учетных записей служб или временных перезагрузок (и т. Д.).

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

Here to study again!

Это 20 символов с использованием верхнего и нижнего регистра с пунктуацией. Это невероятно надежный пароль, и нет такого программного обеспечения, которое могло бы создать более безопасный пароль, который мне будет легче запомнить.

1 голос
/ 09 марта 2009

Взгляните на инструмент gpw . Пакет также доступен в репозиториях Debian / Ubuntu.

1 голос
/ 10 декабря 2009

edit: После ответа я понял, что это никак не фонетически запоминается. Оставив ответ в любом случае б / к, я нахожу это интересным. / Редактировать

Старая нить, я знаю ... но стоит попробовать.

1) Я бы, наверное, создал самый большой словарь, который вы можете составить. Разложите их в ведра по части речи.

2) Затем создайте грамматику, которая может составлять несколько типов предложений. «Тип» предложения определяется перестановками частей речи.

3) Случайно (или как можно ближе к случайному), выберите тип предложения. Возвращается шаблон с заполнителями для частей речи (n-v-n будет существительным-глаголом-существительным)

3) Случайно подбирать слова в каждой части речевого сегмента, чтобы заменить их. Заполните их. (Пример выше может стать чем-то вроде car-ate-bike.)

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

5) результирующий пароль будет выглядеть примерно так: kaR @ tebyCICle

6) смеяться над юмористическими результатами, подобными приведенным выше, которые выглядят как "велосипед каратэ"

0 голосов
/ 09 марта 2009

Я бы действительно хотел бы , чтобы увидеть, как кто-то реализует пароли с управляющими символами, такими как "<Ctrl>+N", или даже комбо-символами, такими как "A+C", одновременно. Преобразование этого в некоторый двоичный эквивалент, IMHO, значительно упростит запоминание требований к паролям, их быстрее набирать и труднее взломать (МНОГИЕ дополнительные комбинации для проверки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...