шифрование с нулевым знанием для базы данных mysql

#php #mysql #security #encryption

#php #mysql #Безопасность #шифрование

Вопрос:

Я изучал шифрование для уровня базы данных моего веб-приложения. Он использует MySQL 5.1 (или выше, я не могу вспомнить навскидку).

Приложение, управляемое моей организацией, хранит данные для общедоступных клиентов.

Самый простой выбор — AES_ENCRYPT / AES_DECRYPT, который поможет, если злоумышленник каким-то образом получил доступ к моей базе данных (при условии, что они не знали ключа).

Однако я хочу сделать еще один шаг вперед и запретить кому-либо в моей организации просматривать любые данные, хранящиеся для клиентов в незашифрованном виде.

Мы используем эту предпосылку для хранения паролей; мы шифруем необработанный пароль на уровне приложения и сравниваем его с предварительно зашифрованным pwd на уровне БД. Очевидно, что это очень распространенный метод, но у нас есть этот ввод от пользователя — решающее отличие от того, что я пытаюсь сделать, заключается в том, что мы не можем хранить незашифрованный «ключ», а использование пароля пользователя проблематично, потому что (помимо другой кучи причин), если они его изменят,все зашифрованные данные должны быть изменены.

Я не могу разобраться в этой идее (вы, вероятно, догадались, что я не эксперт в криптографии), но ожидал, что Google выдаст несколько указателей. К сожалению, я не так много смог найти. Я был бы признателен за любые указания о том, с чего начать исследование.

Комментарии:

1. Какова ваша модель угроз? То есть, что вы пытаетесь защитить от кого?

2. Данные финансового характера; банковские счета, детали транзакций и т. Д. Таким образом, это конфиденциальные данные, а не то, что может позволить себе утечку. На данный момент приложение все еще находится в разработке, поэтому вопрос о том, откуда может исходить угроза, все еще изучается. Но внутри организации нельзя исключать, поэтому я заинтересован в том, чтобы никто не мог просматривать сохраненные данные.

3. Ваши условия поиска в Google — «Управление ключами шифрования». Ожидайте крутой кривой обучения.

4. Спасибо PaulG, по крайней мере, я знаю, куда направить свои исследовательские усилия. Довольно интересное чтение, хотя и сложное, как вы говорите.

Ответ №1:

решающее отличие от того, что я пытаюсь сделать, заключается в том, что мы не можем хранить незашифрованный «ключ», а использование пароля пользователя проблематично, потому что (помимо другой кучи причин), если они изменят его, все зашифрованные данные должны быть изменены

Эти две идеи помогут вам пройти большую часть пути:

  • Используйте ключ для шифрования данных (так, как вы хотите)
  • Вместо того, чтобы хранить этот ключ в открытом виде, используйте пароль пользователя для шифрования ключа
  • При входе пользователя в систему вы сравниваете его пароль с односторонней версией самого себя (хэшированный / соленый, как обычно)
  • Когда это совпадает, вы используете пароль для расшифровки ключа шифрования данных
  • Затем вы используете этот ключ для доступа к зашифрованным данным

Когда пользователь меняет свой пароль, ключ расшифровывается со старым паролем и повторно шифруется с новым паролем. Минимальные усилия, без повторного шифрования всего набора данных.

Когда я пишу это, это кажется очевидным / тривиальным. Я не эксперт по криптографии, и мне также нужен ответ на этот вопрос, поэтому, пожалуйста, укажите дыры в моей идее в комментариях.