Мнемонический алгоритм поколения пароля для QWERTY-клавиатур

У меня есть "мнемоническая" функция поколения пароля, которая проходит примерно так:

function Mnemonic($mnemonic)
{
    $result = null;
    $charset = array(str_split('aeiou', 1), str_split('bcdfghjklmnpqrstvwxyz', 1));

    for ($i = 1; $i <= $mnemonic; $i++)
    {
        $result .= $charset[$i % 2][array_rand($charset[$i % 2])];
    }

    return $result;
}

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

QWERTY Keyboard Layout

Например, в то время как *отклоняют новичка, я всегда предпочитаю, чтобы RHEL основывал дистрибутивы по Debian, главной причиной является простота ввода yum по сравнению с простотой ввода apt[-get], просто попробуйте его за себя.

Как я должен реализовать логику для генерации строк, которые легко ввести на QWERTY-клавиатурах?

12
задан Community 8 February 2017 в 14:20
поделиться

7 ответов

Возможно, вам стоит взглянуть на принципы, используемые в клавиатуре Dvorak,

Эти принципы, применяемые в алгоритме генерирования паролей, будут следующими:

  • Буквы должны набираться меняющимися руками.
  • Используйте простые для набора комбинации. Посмотрите на раскладку Dvorak и ознакомьтесь с распространенными диграфами и расположением их букв.
  • Используйте только одну букву из нижнего ряда или не используйте. Делайте это произвольно!
  • Вы можете сделать соотношение 2 к 1 (2 буквы, набранные правой рукой, к 1 букве, набранной левой рукой).
  • Поскольку соотношение 2 к 1, у вас будет 2 последовательные буквы, набранные одной и той же рукой, поэтому вам нужно убедиться, что они набраны от внешней стороны клавиатуры к внутренней. Этот принцип применяется к диграфам.

Я знаю, вы сказали, что это QWERTY-клавиатура, но использование этих принципов на QWERTY-клавиатуре может дать очень хорошие результаты, например:

ktrd,ogkdo ("печатная машинка" в dvorak)

kjg;g;akd;k (используя только начальный ряд)

pjedoildupsk (просто случайный пароль, соответствующий принципам)

Все ненавистники Dvorak, замолчите!

Надеюсь, это поможет.

1
ответ дан 2 December 2019 в 22:37
поделиться

Можно исключить все символы, которые печатаются кольцом и мизинцем (q,w,x,z,p), затем выплюнуть символы, которые печатаются левой и правой рукой, и чередовать эти буквы.

2
ответ дан 2 December 2019 в 22:37
поделиться

Возможно, вы сможете использовать эвристику для измерения «простоты набора текста».

Например, рассмотрите стоимость перемещения пальца при переходе к следующему символу. Это может зависеть от того, как далеко палец должен переместиться, в каком направлении и т. Д.

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

Немного поигравшись с затратами, вы, вероятно, найдете удовлетворительное решение.

Надеюсь, что это поможет.

1
ответ дан 2 December 2019 в 22:37
поделиться

Отличный вопрос - учитывая приведенные выше предложения, вот формулы для расстояния от клавиши i до клавиши j:

Вес = расстояние * a + переключатель * b + то же самое * c + shift * d + странно * e + начало * f

Расстояние - это значение, остальные - значения 0/1.

Расстояние - получите, наложив тонкую сетку на клавиатуру QWERTY, найдите x, y и вычислите расстояние. Расстояние имеет положительный вес. Если комбинация букв написана разными руками (например, aj, sk, wu ...), расстояние равно нулю.

Переключатель - отрицательный вес; переключение хорошее

То же - aq, qa, az, za используют один и тот же палец. То же самое и с положительным знаком

Shift - все, что имеет сдвиг, является положительным и очень плохим

Странно - я не знаю, $ или ~ плохо, потому что вам нужно смотреть на клавиатуру.

Start - начало или конец asdfjkl. Наверное, отрицательно и хорошо, так как ваши пальцы находятся в состоянии покоя.

Коэффициенты - просто заставьте их начать, пока относительные значения кажутся разумными. Если вы ДЕЙСТВИТЕЛЬНО хотите пофантазировать - попросите кого-нибудь ввести несколько десятков наборов чисел, использовать секундомер и соответствовать модели регрессии.

Реализация - скажем, у нас есть шестизначный пароль.

Теперь мне нужно наименьшее значение для шести символов, начинающихся с каждой буквы. Представьте себе массив из ваших N ключей в столбцах. А теперь представьте шесть колонн. Самый короткий пароль - это кратчайший путь через шесть столбцов (с допустимыми циклами). Возможно, вам потребуется добавить некоторую логику, чтобы исключить циклы, но это должно быть хорошим первым шагом. (Мне здесь лень - вероятно, есть формулировка из теории графов, которая решает эту проблему.)

Держу пари, что кто-то делал это раньше - особенно часть нажатия клавиш.

1
ответ дан 2 December 2019 в 22:37
поделиться

Carpalx провел множество исследований по расчету усилия при печати , которое включает:

  • расстояние перемещения пальца
  • штрафы для руки, пальца и ряда
  • траекторию хода

Результатом их исследования стала раскладка клавиатуры Colemak , которая утверждает, что она лучше, чем у Дворжака .

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

Итак - даже если вы не сможете использовать его напрямую, я подумал, что он может показаться вам интересным (и кто знает, если ваш Perl-fu силен, вы сможете извлечь и обратить алгоритм, поскольку он GPL ).

3
ответ дан 2 December 2019 в 22:37
поделиться

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

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

# Key at top left corner is {0, 0}
key1 @ {x1, y1}
key2 @ {x2, y2}

xdistance = absolute_value(x2 - x1)
ydistance = absolute_value(y2 - y1)

if y1 > y2
  xdistance += (1/3 * ydistance)
else
  xdistance -= (1/3 * ydistance)

total_distance = square_root(xdistance^2 + ydistance^2)

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

0
ответ дан 2 December 2019 в 22:37
поделиться

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

Лично я не считаю медленным набор букв одной и той же рукой дважды: только если при наборе предыдущей буквы палец находился слишком близко, это затруднительно. Например, XQ трудно набирать, потому что моя рука должна двигаться вверх, чтобы справиться с соседними пальцами, необходимыми для набора. Но мне совсем не трудно набирать BQ, потому что пока мой указательный палец работает над буквой B, мой мизинец может направиться к Q.

Также гораздо легче набирать AW, чем QS, потому что безымянный палец длиннее и поэтому естественно помещается на W, в то время как мизинец находится на A, в положении, близком к покою, в то время как QS требует растяжения мизинца и одновременного, противоречивого мышечного хруста безымянного пальца.

Если вы начнете строить карту каждой буквы относительно каждой другой буквы, вы вскоре найдете разумный способ представления различных аспектов легкости или трудности. Обобщая мой пример с XQ/BQ, вы можете сделать так, чтобы для смены одной строки требовалось расстояние в 2 или более пальцев, для смены двух строк - расстояние в 3 пальца, а для смены трех строк (возможно, цифр) - чередование рук.

Я также заметил, что немного большее расстояние между WD и IL, чем между SE и KO, также меняет сложность, из-за немного неровного расположения клавиш.

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

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

0
ответ дан 2 December 2019 в 22:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: