Pull to refresh

Альтернатива использованию одинаковых паролей

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


У меня возникла идея генерировать пароли, используя мастер-ключ и адрес сайта. Изначально алгоритм был написан на golang, но в статье я покажу реализацию на python, в связи с большей популярностью этого языка. Для генерации пароля нам понадобится медленная хеш функция, которая максимально усложнит возможность перебора мастер-ключа, в случае, если один из сгенерированных паролей все же попадет не в те руки. Я решил не изобретать велосипед и воспользоваться стандартом PBKDF2. Его реализация уже есть в стандартной библиотеке python.
Предположим, что в переменной master уже содержится мастер-ключ, а в url — адрес сайта. В iter мы храним количество итераций, а в length — желаемую длину пароля.


key = list(hashlib.pbkdf2_hmac(
    'sha256', master.encode('utf-8'), url.encode('utf-8'), iter, length))

Теперь в key содержится список чисел от 0 до 255 длиной length, который мы и будем преобразовывать в пароль. Для этого нам понадобится строка, содержащая все допускаемые символы


chars = string.ascii_uppercase + string.ascii_lowercase + \
    string.digits + string.punctuation

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


password = ''.join([chars[i % len(chars)] for i in key])

Протестировать алгоритм можно прямо в браузере. Генерация происходит на стороне клиента.


Исходный код реализации на golang доступен на github.

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.