Компрометация хэша пароля
Прошу помочь с ответом на простой вопрос, поскольку немного запарился. Пусть сервер хранит хэши от клиентских паролей с каким-то рандомным вектором h(pass,R1) и пусть кто-то взломал сервер и прочитал эти хэши. Как правило утверждается, что хранение хэшей пароля на сервере спасает от компрометации пароля при взломе сервера, но вообще то не спасает отподдельной аутентификации, поскольку когда придет время вычислять h(R2,h(pass,R1)) на стороне клиента и сервера, сравнивая результаты, то взломщик решит задачу правильно, поскольку украл h(pass,R1), а R2 ему предоставит сервер или он его подслушал. Тогда какой резон утверждать про "отсутствие компрометации пароля", когда по факту взломщик зная хэш пароля всё равно успешно проходит аутентификацию на сервере под именем клиента?
Если был порутан сервак, то да, конечно, будет скомпрометировано все.
Если был получен доступ к базе (например, sql-inj), то при аутентификации на сервер будет передан пароль, и там будет посчитано h(pass,R1). Почему вы считаете, что h(R2,h(pass,R1)) должно считаться у клиента? Если так реализовано, то конечно, h(pass,R1) само никогда не меняется и является, в некотором смысле, незасоленным паролем.
Хранение хэшированных паролей может как перекрывать угрозу от компрометации базы, так и не перекрывать, в зависимости от фактического протокола аутентификации и поддержания сессии. Если в базе хранятся хэши паролей (без разницы, с солью или без), а клиент при аутентификации передаёт нехэшированный пароль, то такая схема устойчива к компрометации базы — противник получит только хэши, которые для аутентификации необходимо инвертировать.
Что-то типа «length extension attack»[link1]?
Потому что рассматривается ситуация, когда h(R2,h(pass,R1)) вычисляется на клиенте и на сервере, чтобы сервер мог убедится в том, что клиент знает пароль.
Удлиннения тут не причем, пример взят из статьи в Википедии,[link2]где много бестолковщины.
В общем, совместить хранение только хэша на сервере и передачу только хэша пароля клиентом не получится?
З.Ы. То есть невозможно хранить хэш пароля на сервере так, чтобы компрометация этого хэша не приводила к компрометации аутентификации, если аутентификация выполняется по хэшу же?
Храните на сервере H(H(P)). В этом случае переданный клиентом хэш H(P) хэшируется сервером ещё один раз и сравнивается с записью базе. При этом, опять же, компрометация базы не позволяет использовать её содержимое для аутентификации.