#php #mysql #security #encryption
#php #mysql #Безопасность #шифрование
Вопрос:
Я изучал шифрование для уровня базы данных моего веб-приложения. Он использует MySQL 5.1 (или выше, я не могу вспомнить навскидку).
Приложение, управляемое моей организацией, хранит данные для общедоступных клиентов.
Самый простой выбор — AES_ENCRYPT / AES_DECRYPT, который поможет, если злоумышленник каким-то образом получил доступ к моей базе данных (при условии, что они не знали ключа).
Однако я хочу сделать еще один шаг вперед и запретить кому-либо в моей организации просматривать любые данные, хранящиеся для клиентов в незашифрованном виде.
Мы используем эту предпосылку для хранения паролей; мы шифруем необработанный пароль на уровне приложения и сравниваем его с предварительно зашифрованным pwd на уровне БД. Очевидно, что это очень распространенный метод, но у нас есть этот ввод от пользователя — решающее отличие от того, что я пытаюсь сделать, заключается в том, что мы не можем хранить незашифрованный «ключ», а использование пароля пользователя проблематично, потому что (помимо другой кучи причин), если они его изменят,все зашифрованные данные должны быть изменены.
Я не могу разобраться в этой идее (вы, вероятно, догадались, что я не эксперт в криптографии), но ожидал, что Google выдаст несколько указателей. К сожалению, я не так много смог найти. Я был бы признателен за любые указания о том, с чего начать исследование.
Комментарии:
1. Какова ваша модель угроз? То есть, что вы пытаетесь защитить от кого?
2. Данные финансового характера; банковские счета, детали транзакций и т. Д. Таким образом, это конфиденциальные данные, а не то, что может позволить себе утечку. На данный момент приложение все еще находится в разработке, поэтому вопрос о том, откуда может исходить угроза, все еще изучается. Но внутри организации нельзя исключать, поэтому я заинтересован в том, чтобы никто не мог просматривать сохраненные данные.
3. Ваши условия поиска в Google — «Управление ключами шифрования». Ожидайте крутой кривой обучения.
4. Спасибо PaulG, по крайней мере, я знаю, куда направить свои исследовательские усилия. Довольно интересное чтение, хотя и сложное, как вы говорите.
Ответ №1:
решающее отличие от того, что я пытаюсь сделать, заключается в том, что мы не можем хранить незашифрованный «ключ», а использование пароля пользователя проблематично, потому что (помимо другой кучи причин), если они изменят его, все зашифрованные данные должны быть изменены
Эти две идеи помогут вам пройти большую часть пути:
- Используйте ключ для шифрования данных (так, как вы хотите)
- Вместо того, чтобы хранить этот ключ в открытом виде, используйте пароль пользователя для шифрования ключа
- При входе пользователя в систему вы сравниваете его пароль с односторонней версией самого себя (хэшированный / соленый, как обычно)
- Когда это совпадает, вы используете пароль для расшифровки ключа шифрования данных
- Затем вы используете этот ключ для доступа к зашифрованным данным
Когда пользователь меняет свой пароль, ключ расшифровывается со старым паролем и повторно шифруется с новым паролем. Минимальные усилия, без повторного шифрования всего набора данных.
Когда я пишу это, это кажется очевидным / тривиальным. Я не эксперт по криптографии, и мне также нужен ответ на этот вопрос, поэтому, пожалуйста, укажите дыры в моей идее в комментариях.