В Joomla 1.0.12
пароли хранились в виде хешей md5.
Пароль, введенный пользователем, хешируется и сравнивается с хешем из базы данных.
Если хеши совпали – значит пользователь тот за кого себя выдает.
В Joomla 1.0.13
это изменено, пароли хранятся следующим образом:
при записи пароля генерируется псевдослучайная строка из 16 символов.
Затем эта строка складывается с паролем, полученная стока хешируется по алгоритму md5:
md5 (пароль + случайная строка) = хеш_пароля_и_строки
В базе данных хранится хеш_пароля_и_строки и сама эта псевдослучайная строка через двоеточие:
хеш_пароля_и_строки:случайная_строка
Авторизация осуществляется следующим образом:
- из базы достается вся хранящаяся там строка,
- введенный пароль складывается с тем, что стоит после двоеточия (это сгенерированная при регистрации случайная строка)
- от полученной строки берется хеш и сравнивается с тем, что стоит до двоеточия.
Предложенный протокол
не предполагает передачи пароля в открытом виде (в этом его суть):
В браузере введенный пароль хешируется и складывается со строкой переданной сервером (это строка каждый раз разная):
md5 ( md5(введенный_пароль) + строка_от_сервера) = хеш_пароля_и_строки_сервера
строка_от_сервера зависит от секрета сервера, временной метки начала авторизации и ip адреса.
- хеш_пароля_и_строки_сервера передается на сервер,
- там снова вычисляется строка_от_сервера2,
- и базы данных достается хеш пароля,
- полученный из БД хеш пароля складывается с только что вычисленной строкой строка_от_сервера2 и опять хешируется:
md5 ( хеш_пароля_из_БД + строка_от_сервера2) = хеш_пароля_и_строки_сервера2
Потом строка полученная от браузера сравнивается с вычисленной на сервере:
хеш_пароля_и_строки_сервера == хеш_пароля_и_строки_сервера2.
Так вот
из-за нововведения в Joomla 1.0.13 браузер должен был бы считать не просто хеш пароля, а хеш от строки пароля сложенной с псевдослучайной строкой сгенерированной при регистрации (та которая хранится после двоеточия). Однако браузер никак не может узнать эту строку.
А вот зачем это
было сделано, я так и не понял. Почему не хранить просто хеши паролей?
Это псевдослучайная строка, добавляемая к паролю перед хешированием, все равно хранится в БД вместе с хешем.
Если злоумышленник получит копию базы данных, он сможет подобрать пароль по хешу точно также, как если бы захеширован был бы только пароль.
Т.е. ранее он, при удачном подборе строки под конкретный хеш, получал сразу пароль, то теперь он получает пароль + добавленная_строка.
И строка эта ему известна, а отрезать известную строку от конца другой – это элементарная операция.