Я бы пошел с 2, но использовать немного соли. Какой-то псевдокод:
SetPassword(user, password)
salt = RandomString()
hash = Hashfunction(salt+password)
StoreInDatabase(user, salt, hash)
CheckPassword(user, password)
(salt, hash) = GetFromDatabase(user)
if Hashfunction(salt+password) == hash
return "Success"
else
return "Login Failed"
Важно использовать хорошо известную хеш-функцию (например, MD5 или SHA-1), реализованную в библиотеке. Не бросайте свои собственные и не пытайтесь реализовать это из книги просто не стоит рисковать, если вы ошибетесь.
@ Brian R. Bondy: причина, по которой вы используете соль, состоит в том, чтобы усилить атаку по словарю, злоумышленник не может хэшировать словарь и пытаться использовать все пароли, вместо этого он должен взять соль + словарь и хэшировать его что делает требования к хранению expode. Если у вас есть словарь из 1000 самых распространенных паролей и хэшируйте их, вам нужно что-то вроде 16 кБ, но если вы добавите две случайные буквы, вы получите 62 * 62 * 16 кБ ≈ 62 МБ.
В противном случае вы могли бы использовать какие-то одноразовые пароли Я слышал много хорошего об OTPW, но не использовал его.