Мне нужно создать 1000 одноразовых паролей из 6 цифр, и алгоритмом валидации на основании какого-нибудь ключа. Как это сделать?
Чуть подробнее: есть, например ключ `top_secret`, можно сделать пароли по принципу md5(`top_secret`+`1`), md5(`top_secret`+`2`), т.д. но в таком случае для проверки пароля нужно сверяться с базой, либо перебирать все md5(`top_secret`+`n`).
Хочется, чтобы существовал какой-то простой принцип проверки пароля на валидность сложности O(1), а не O(N), где N — количество паролей.
UPD. Написал может немного сумбурно. Короче приходит ко мне пользователь — я не знаю про него ничего. У него пароль из 6 цифр. Мне нужно проверить, действительный ли это пароль, или нет. Проверку на валидность хочется реализовать не через поиск в базе данных, или перебора хэшей, а каким-то более простым способом.
1. Сфера применения? (можно часть брать от логина, от пола юзера, отдела, IP, etc)
2. Вы хотите просто понять, что это пароль из вашего списка, на глаз, и только потом обращаться к БД/форме входа? Или же по обратившемуся понять какой у него пароль?
Если проверять на валидность только сам пароль, то можно обойтись контрольной цифрой.
Генерируем пароль из 5 цифр — 12345, складываем их до 1 знака 1+2+3+4+5 = 15 = 1+5 = 6, итоговый пароль 123456.
111115, 111126, 111137, 574108.
Контрольную цифру можно сдвигать куда угодно, что снижает риски того, что кто-то сам придумает пароль.
А, ну тогда и задачу стоит ставить иначе. У вас в вопросе написано про 1000 и 6 — я и предложил оптимальное решение для этих цифр.
Ну используйте цифровую подпись — пусть у вас пароль будет составной, первая часть — имя пользователя ну или просто половина пароля, вторая часть — подписанная вашим закрытым ключем первая часть. Тогда, чтобы проверить полученный пароль, подписывайте половину полученного пароля и сверяйте со второй половиной.
Если еще проще, то сгенерите секретный ключ, дальше генерите строки вида AAA, BBB, AB, AB или любые другие с четким паттерном, и шифруйте их ключем. Алгоритм проверки — расшифровывайте полученный от юзера пароль и проверяйте паттерн. Это менее надежно чем первый способ.