
Захотелось мне как-то для своих нужд сделать собственную имплементацию генератора безопасных паролей. Скрипт писался для своего маленького проекта на PHP с использованием библиотеки mcrypt. Сам принцип действия мне показался интересным, поэтому решил поделится данным кодом.
Tактико-технические характеристики имплементации:
— диапазон символов: Aa—Zz и 0—9
— максимальная длинна пароля: 300 символов
— rand() не используется
— пароли генерятся через симметричный блочный алгоритм Serpent-256 в режим сцепления блоков (CBC-mode)
при секретном меняющемся начальном векторе, секретном ключе и длинном секретном блоке случайных символов
— для изменения вектора используется SHA256
— 3 файла: generator.php, counter.txt, iv.txt
— имеется счетчик для красоты
Две функции:
make_password(int length); // возвращает пароль заданной длинны, по умолчанию 22 = 128 bit
print_password(int length); // красиво печатает пароль
Псевдокод: base64(serpent(key, iv, plaintext, cbc))
Примерно так делается пароль, самая важная часть процесса.
(Как меняется начальный вектор и все остальное
смотрите, пожалуйста, в php-коде.
В коде в интересных местах есть комментарии.)
Полный код генератора, содержит html-тэги:
http://www.copypastecode.com/8660/
generator.php выдает вот такую таблицу для быстрого копирования паролей.

У меня все это работает на сервере через шифрованный SSL-канал, так что пароли видны только мне.
Ссылку не дам — я жадный параноик, еще хакните меня и трафик унесете.
Если захотите использовать этот код, измените все значения (ключ, вектор, текст, ну и счетчик). Вектор и счетчик у меня хранятся в файлах, можете свои хранить в базах данных (например MySQL) или еще где-нибудь. Хорошо еще генерить пароли на локальной машине или через защищенный канал. Помещать данный код в открытый доступ через простой http, по моему, крайне глупо.
Спасибо крутому хабрамэну lyxsus за инвайт.