В настоящее время очевидна необходимость использования уникальных паролей для каждого сервиса. Однако, многие, даже будучи технически подкованными людьми, все равно предпочитают использовать одинаковые. Причин этому много, но основная — люди хотят иметь доступ к своему аккаунту всегда и везде, не заботясь о том, есть ли у них под рукой база данных.
У меня возникла идея генерировать пароли, используя мастер-ключ и адрес сайта. Изначально алгоритм был написан на 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.