Как сгенерировать возможные комбинации паролей из конкретной спецификации для сравнения хешей с - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь сгенерировать список строк (возможных паролей), которые затем можно хэшировать (SHA-256) для сравнения с уже существующими хешами паролей, которые у меня есть.

Я знаю, что пароль долженбыть популярным именем для мальчиков или девочек, без указания регистра, за которым следует число в диапазоне от 0 до 9999, например, BoB167, AliCE1000, conNor99, tHe9329

Как можно генерировать возможные строки пароля, такие как парольможет быть так, что я могу затем их хешировать, чтобы сравнить с моими хэшами

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

1 Ответ

0 голосов
/ 20 декабря 2018

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

  • Для данного имени с n символами возможны 2 n возможные комбинации прописных и строчных букв.
    Напримердля bob существует 2 3 = 8 возможных комбинаций.

  • Цикл от 0 до 2 n будетвыведите 2 n последовательных целых чисел.
    Например, для bob, это будет 0, 1, 2, 3, 4, 5, 6 и 7.

  • Битовые комбинации этих целых чисел можно использовать для определения того, должен ли символ быть прописным или строчным.
    Например, для bob, битовые комбинации будут 000, 001, 010, 011 и т. Д.
  • Затем можно использовать немного магии сдвига битов (заимствовано из здесь ), чтобы определить, является ли n th бит в целом числе устанавливается для генерации фактических комбинаций имен.

Пример кода

public class Test {
    public static void main(String[] args) {
        combinations("bob");
    }

    private static void combinations(String name) {
        char[] chars  = name.toCharArray();

        for (int i = 0; i < Math.pow(2, chars.length); i++) {
            char[] result = new char[chars.length];

            for (int n = 0; n < chars.length; n++) {
                result[n] = isBitSet(i, n) ? Character.toUpperCase(chars[n])
                                           : Character.toLowerCase(chars[n]);
            }

            System.out.println(result);
        }
    }

    private static boolean isBitSet(int i, int n) {
        return ((i & (1 << n)) != 0);
    }
}

Выход

Это дает следующий вывод:

bob
Bob
bOb
BOb
boB
BoB
bOB
BOB
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...