Meefik's Blog

Freedom and Open Source

Подбор пароля к Java keystore

Интересная история произошла со мной не так давно. Я опубликовал в Google Market приложение, а когда пришло время его обновить, я обнаружил, что потерял пароль от ключа для подписи своих приложений. Стандартным выходом из этой ситуации было создание нового ключа, закрытие старого приложения и размешение нового приложение под новым именем в маркете. Этого делать очень не хотелось и в итоге появилось приложение KeystoreBreaker. Приложение позволяет осущетвить подбор пароля к keystore по определенным условиям с возможностью распределенного вычисления. Можно задать набор символов, из которых состоит предполагаемый пароль, а затем разделить все возможные комбинации этих символов на непересекающиеся группы и перебор по каждой группе осуществлять отедльно. Это может быть и распределение по нескольким ядрам в рамках одного компьютера, так и распределение по нескольким компьютерам. Суть алгоритма в том, что каждый вариант пароля представляется в N-ричной системе счисления, которая формируется на основе входного набора символов. После этого весь диапазон от первого до последнего символа, например 000000-zzzzzz, можно поделить на любое число более мелких диапазонов, в которых и осуществляется перебор.

Формат запуска утилиты такой:

java -jar KeystoreBreaker.jar <keystore file> <sequence> <first passwd> <last passwd> <number of threads>

Пример использования:

$ java -jar KeystoreBreaker.jar test.jks 0123456789abcdefghijklmnopqrstuvwxyz 000000 zzzzzz 4

Keystore: test.jks
Threads: 4
Sequence: 01256789abcdefghijklmnopqrstuvwxyz
First password: 000000
Last password: zzzzzz
Combinations: 1544804415
Distribution by threads: 
#0: 000000 - 2000ja
#1: 2000ja - 10000j
#2: 10000j - 0000jr
#3: 0000jr - zzzzzz
Processing: 
#0: wxj000 / 2000ja  0% [ 20735 pwd/s ]
#1: zhk0ja / 10000j  0% [ 21327 pwd/s ]
#2: fij00j / 0000jr  0% [ 20187 pwd/s ]
#3: uxj0jr / zzzzzz  0% [ 20713 pwd/s ]
Total: 0% [ 82943 pwd/s ]  Time left: 0.05:10:23

Моя история с потеренным паролем закончилась хорошо, за несколько дней на четырех 12-ядерных процессорах мне удалось подобрать свой пароль. Помогло то, что я знал из каких символов состоял пароль и какой длины он был.