ionicman
@ionicman

Вопрос про быструю проверку пароля?

Вопрос у меня к практикующим криптографам :)


Собственно шифруются файлы через mcrypt на сервере.

Алгоритм MCRYPT_RIJNDAEL_256, вектор вшит в исходник, режим MCRYPT_MODE_CFB.


Вопрос вот в чем — на любое обращение к серверу мне требуется проверить пароль на правильность.


Делать каждый раз разкриптовку какой-то ключевой фразы и проверку ее на валидность можно, но я так понимаю, если эта фраза небольшая, то я существенно облегчаю взлом пароля — ибо вектор известен, алгоритм — тоже и плюc фраза на которую проверяю?


типа if ( decrypt( «somethingcrypted», pass ) == «something» ) { ok }


Есть ли какое-либо решение данной проблемы?

Как в больших системах проверяются пароли? Хранятся хэши? типа if hash(passw) == hash?


Опять-же это уязвимость, с моей точки зрения.

Может есть какоето стандартное решение, bcrypt или чтото еще надо использовать?


Заранее огромное спасибо за помошь.
  • Вопрос задан
  • 2719 просмотров
Пригласить эксперта
Ответы на вопрос 5
vajadhava
@vajadhava
На логине проверяем совпадение хэши пароля + соли + хэш имени пользователя + что-то еще. Если все валидно, создаем временный идентификатор, token, с небольшим временем жизни, по мере обращения проверяем его, инкрементим время жизни. Устаревшие идентификаторы удаляем. Используем защищенные соединения для организации обмена данными между клиентом и сервером.
В вашем случае если проверять при каждой операции хэш хоть от всего пароля, хоть от 70%, клиентская сторона постоянно этот пароль передает на сервер для сравнения, что небезопасно.
Ответ написан
Комментировать
ionicman
@ionicman Автор вопроса
Предложили одно решение, вполне, как вариант:
Для быстрой проверки пароля использовать sha1 hash, но хэшировать не весь пароль а 70%.
Т.е. что-то наподобие if ( sha1_hash( truncate( pass, (int)(len * 0.7) ) ) == hash ) {} в этом случае даже если скачали сервак со всем потрохами, это замедлит расшифровку.
Если же получили доступ до сервакас 70% паролем, то при скачке файла получат фейл.
Ответ написан
Комментировать
ANUFRiY
@ANUFRiY
Ещё замечание:
Не передаём пароль в открытом виде через сеть.
Генерируем соль при генерации страницы входа, хешируем пароль солью на стороне клиента, а потом на стороне сервера ищем что нужно по базе както вот так:

select * from 'users' where login = '%login%' AND MD5(CONCAT('%salt%', `password`')) = '%hash%');

%login% и %hash% приходят из формы.

%salt% — в данном случае, Ваша сгенерированная соль. Она может быть как статической, так и динамической (что лучше). Но во втором случае соли нужно гдето хранить.

В результате получаете при перехвате пароля перехватят нечто невнятное, не дешифруемое и непрогоняемое так просто по базам хешей.
Ответ написан
Комментировать
ANUFRiY
@ANUFRiY
Если Вы хотите держать пароли в таком виде, чтобы их можно было расшифровать до оригинального значения, делайте это отдельно. А авторизацию делайте по хешам.
Ответ написан
Комментировать
@mt_
На всякий случай скажу, что хранить пароль в открытом виде на клиентском ПК — не очень удачная идея. Потому что храниться он будет в куки (ну максимум — в локальном хранилище браузера), а к ним можно получить доступ целым рядом способов. Поэтому я бы задмался над самой схемой защиты.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы