Собственно шифруются файлы через mcrypt на сервере.
Алгоритм MCRYPT_RIJNDAEL_256, вектор вшит в исходник, режим MCRYPT_MODE_CFB.
Вопрос вот в чем — на любое обращение к серверу мне требуется проверить пароль на правильность.
Делать каждый раз разкриптовку какой-то ключевой фразы и проверку ее на валидность можно, но я так понимаю, если эта фраза небольшая, то я существенно облегчаю взлом пароля — ибо вектор известен, алгоритм — тоже и плюc фраза на которую проверяю?
типа if ( decrypt( «somethingcrypted», pass ) == «something» ) { ok }
Есть ли какое-либо решение данной проблемы?
Как в больших системах проверяются пароли? Хранятся хэши? типа if hash(passw) == hash?
Опять-же это уязвимость, с моей точки зрения.
Может есть какоето стандартное решение, bcrypt или чтото еще надо использовать?
На логине проверяем совпадение хэши пароля + соли + хэш имени пользователя + что-то еще. Если все валидно, создаем временный идентификатор, token, с небольшим временем жизни, по мере обращения проверяем его, инкрементим время жизни. Устаревшие идентификаторы удаляем. Используем защищенные соединения для организации обмена данными между клиентом и сервером.
В вашем случае если проверять при каждой операции хэш хоть от всего пароля, хоть от 70%, клиентская сторона постоянно этот пароль передает на сервер для сравнения, что небезопасно.
Предложили одно решение, вполне, как вариант:
Для быстрой проверки пароля использовать sha1 hash, но хэшировать не весь пароль а 70%.
Т.е. что-то наподобие if ( sha1_hash( truncate( pass, (int)(len * 0.7) ) ) == hash ) {} в этом случае даже если скачали сервак со всем потрохами, это замедлит расшифровку.
Если же получили доступ до сервакас 70% паролем, то при скачке файла получат фейл.
Ещё замечание:
Не передаём пароль в открытом виде через сеть.
Генерируем соль при генерации страницы входа, хешируем пароль солью на стороне клиента, а потом на стороне сервера ищем что нужно по базе както вот так:
select * from 'users' where login = '%login%' AND MD5(CONCAT('%salt%', `password`')) = '%hash%');
%login% и %hash% приходят из формы.
%salt% — в данном случае, Ваша сгенерированная соль. Она может быть как статической, так и динамической (что лучше). Но во втором случае соли нужно гдето хранить.
В результате получаете при перехвате пароля перехватят нечто невнятное, не дешифруемое и непрогоняемое так просто по базам хешей.
Если Вы хотите держать пароли в таком виде, чтобы их можно было расшифровать до оригинального значения, делайте это отдельно. А авторизацию делайте по хешам.
На всякий случай скажу, что хранить пароль в открытом виде на клиентском ПК — не очень удачная идея. Потому что храниться он будет в куки (ну максимум — в локальном хранилище браузера), а к ним можно получить доступ целым рядом способов. Поэтому я бы задмался над самой схемой защиты.