Тяжеловес:
:
без виджетов GUI:
Во-первых, добавьте поле в базу данных, чтобы определить, использует ли пароль MD5 или новый алгоритм.
Для всех паролей, все еще использующих MD5:
- В процесс входа в систему, в котором вы проверяете введенный пользователем пароль: временно сохраняете отправленный пользователем пароль в памяти (здесь нет проблем с безопасностью, поскольку он уже где-то в памяти) и выполняете обычный хэш MD5 и сравниваете с сохраненным хешем;
- - Если был задан правильный пароль (соответствует существующему хешу), запустите временно сохраненный пароль с помощью нового алгоритма, сохраните это значение, обновите новое поле, чтобы указать, что этот пароль был обновлен в соответствии с новым алгоритмом.
(Of конечно, вы просто использовали бы новый алгоритм для любых новых пользователей / новых паролей.)
Добавить поле даты и времени passwordChange в базу данных.
Все пароли, установленные до дня X, проверьте с помощью MD5
Все пароли, установленные после дня X, проверьте с помощью BCrypt или чего-то еще.
Вы можете сохранить либо в самом поле хэша (например, «MD5: d41d8cd98f00b204e9800998ecf8427e») или в другом столбце, какой алгоритм использовался для создания этого хэша. Затем вам придется изменить процесс входа в систему, чтобы использовать правильный алгоритм при проверке пароля. Естественно, любые новые пароли будут хешироваться с использованием нового алгоритма. Будем надеяться, что пароли в конечном итоге истекут, и со временем все хэши MD5 будут прекращены.
Поскольку вы не знаете пароль в виде обычного текста, возможно, вам следует создать поле, которое указывает версию шифрования (например, PasswordVersion bit default 0
)
Далее Когда пользователь пытается войти в систему, проверьте хешированный пароль, используя текущую версию алгоритма, как вы это делаете сегодня. Если он совпадает, хешируйте его еще раз и обновите поле PasswordVersion
.
Надеюсь, вам не понадобится столбец PasswordVersion
, размер которого превышает бит
. =)
Вы можете посмотреть на расширение gettext . Более конкретно, похоже, что ngettext ()
будет делать то, что вы хотите: он правильно формирует множественное число слов, если у вас есть число, по которому следует считать.
print ngettext('odor', 'odors', 1); // prints "odor"
print ngettext('odor', 'odors', 4); // prints "odors"
print ngettext('%d cat', '%d cats', 4); // prints "4 cats"
Вы также можете заставить его правильно обрабатывать переведенные формы множественного числа, это его основная цель, хотя это довольно много дополнительной работы.
Вы можете преобразовать старые записи в новый алгоритм в следующий раз, когда существующие пользователи войдут в систему, поскольку их пароль будет доступен во время этого процесса:В конце концов, после этого система работает в течение подходящего времени, вы можете отключить учетные записи, в которых нет t был преобразован (при желании).
Добавление случайной строки соли, уникальной для каждой записи, делает эту схему более устойчивой к атакам по словарю с использованием радужных таблиц.
Я не совсем уверен насчет этого варианта, так как я не специалист по криптографии. Пожалуйста, поправьте меня, если я в какой-то момент ошибаюсь!
Я думаю, что у Дэйва П. явно лучший вариант.
... но. Есть автоматическое решение - хешировать сами старые хеши. То есть возьмите текущие хэши и снова их с помощью более сильного алгоритма. Заметьте, что, насколько я понимаю, здесь вы не получаете никакой дополнительной защиты от длины хэша, только добавленную криптографическую сложность нового алгоритма.
Проблема, конечно, в том, что тогда придется проверять пароль. через оба хэша . А ты' Я должен сделать то же самое для каждого нового пароля. Что, в общем, довольно глупо . Если вы не хотите использовать аналогичную схему, как объяснил Дейв П., чтобы в конечном итоге вернуться к одноразовым паролям с новым алгоритмом хеширования ... в таком случае, зачем вообще это беспокоить? (Конечно, вы могли бы использовать его в яркой фразе «Повышенная безопасность для всех паролей, применяется немедленно!» - способ на презентации корпоративным костюмам, с относительно невозмутимым лицом ...)
Тем не менее, это вариант, который может быть применяется сразу ко всем текущим паролям, без какой-либо фазы постепенного перехода.
Но мальчик, о мальчик, кто-нибудь будет посмеяться над этим кодом позже! :)
объяснил, чтобы в конечном итоге вернуться к одноразовым паролям с новым алгоритмом хеширования ... в таком случае, зачем вообще с этим беспокоиться? (Конечно, вы могли бы использовать его в яркой фразе «Повышенная безопасность для всех паролей, применяется немедленно!» - способ на презентации корпоративным костюмам, с относительно невозмутимым лицом ...)Тем не менее, это вариант, который может быть применяется сразу ко всем текущим паролям, без какой-либо фазы постепенного перехода.
Но мальчик, о мальчик, кто-нибудь будет посмеяться над этим кодом позже! :)
объяснил, чтобы в конечном итоге вернуться к одноразовым паролям с новым алгоритмом хеширования ... в таком случае, зачем вообще с этим беспокоиться? (Конечно, вы могли бы использовать его в яркой фразе «Повышенная безопасность для всех паролей, применяется немедленно!» - способ на презентации корпоративным костюмам, с относительно невозмутимым лицом ...)Тем не менее, это вариант, который может быть применяется сразу ко всем текущим паролям, без какой-либо фазы постепенного перехода.
Но мальчик, о мальчик, разве кто-нибудь потом посмеется, глядя на этот код! :)
с относительно невозмутимым лицом ...)Тем не менее, это вариант, который может быть применен сразу ко всем текущим паролям, без какой-либо фазы постепенного перехода.
Но мальчик, о мальчик, кто-то собирается хорошо посмеяться посмотрим на этот код позже! :)
с относительно невозмутимым лицом ...)Тем не менее, это вариант, который может быть применен сразу ко всем текущим паролям, без какой-либо фазы постепенного перехода.
Но мальчик, о мальчик, кто-то собирается хорошо посмеяться посмотрим на этот код позже! :)