Практически любой, даже начинающий разработчик, скажет вам, что
пароли в базе надо хранить только в виде хеша (например md5). Это
обеспечит их сохранность и увеличит безопасность системы в целом. Так
ли это на самом деле?
В действительности нет, не так. Безопасность, да и сохранность,
конечно повысится, но не очень сильно. В интернете уже давно есть базы
хешей многих паролей. Трехминутный поиск только по Яндексу вывел меня
на следующие сайты - MD5decrypter (568 002 хешей) и Insidepro
(10 148 884 хешей). Уже не мало, ведь так? А это только открытые
проекты и только по md5. Я думаю у любой серьезной хакерской группы
есть свои базы, благо, с наличием бот-сетей распределенные вычисления
перестают быть проблемой.
Кто-нибудь самый догадливый предложит, а давайте к пользовательскому
паролю добавлять свой секретный длинный префикс. Ну или делать,
например, md5 от md5. Взломщик никогда об этом не догадается и пароль
не подберет.
Не поможет. В действительности при взломе хеша нам важен не
оригинальный пароль, а поиск коллизии. Ведь неважно введем мы пароль
76854 или Fhndkts если md5(’76854′) будет совпадать с
md5(’наша_секретная_строка’.’Fhndkts’).
Единственная проблема, что вариантов хешей все таки очень много и
они будут занимать очень большое место в базе данных. да и поиск по ним
потребует очень длительного времени.
Однако и эта проблема решается при помощи Rainbow Tables. Используя
их мы на несколько порядков уменьшаем размер хранимой базы и скорость
поиска пароля. Более подробно об этом можно почитать здесь и здесь. Для построение таких таблиц также нужны распределенные вычисления. И такие проекты есть - Rainbowcrack.com.
Размах впечатляет - 2,628 таблиц, 102,080,000,000 цепочек (в каждой
цепочке примерно 1000-1500 паролей), 1.49 Тб данных. Есть также российский подобный проект, но пока добились они намного меньшего.
Вот и как теперь хранить пароль?
© denis.boltikov.ru
|