Как сохранить кодовую фразу для расшифровки защищенных данных?

#ruby-on-rails #security #cookies #encryption

#ruby-on-rails #Безопасность #файлы cookie #шифрование

Вопрос:

У меня есть кодовая фраза для расшифровки данных с использованием открытого ключа в моем приложении rails.

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

Не рекомендуется сохранять кодовую фразу непосредственно в сеансе пользователя / cookie (по соображениям безопасности).

Итак, каков наилучший способ сохранить эту кодовую фразу без нарушения безопасности?

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

1. Не могли бы вы просто объяснить, как долго вы хотите это хранить? Вам нужно хранить ее в запросах или на более длительный срок, чем этот? Нужно ли им отменять шифрование всех данных или только по одному биту за раз?

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

3. Если это веб-приложение rails, отправляет ли пользователь свою кодовую фразу по незащищенному http-соединению? Если это так, злоумышленник может перехватить ее и выдать себя за пользователя. Почему это сообщение не может быть защищено с помощью https?

4. HTTPS не решает проблему. Моя кодовая фраза остается без какой-либо защиты в файле cookie пользователя => вот в чем проблема

Ответ №1:

Предполагая, что:

  • Ваше требование заключается в том, чтобы пользователь мог ввести свою кодовую фразу один раз, а затем получить доступ ко всем своим данным на оставшуюся часть сеанса.
  • Для каждой учетной записи требуется зашифровать большое количество данных (т.Е. более одного счета).

Я бы сделал что-то вроде следующего:

  • Зашифруйте все данные, прикрепленные к учетной записи пользователя, используя безопасный случайный ключ (data key) и симметричный шифр (например, AES).
  • Предоставьте каждой учетной записи открытый / закрытый ключ (account key) с парольной фразой, выбранной пользователем.
  • Зашифруйте ключ данных, используя общедоступный ключ учетной записи, и сохраните его.
  • Создайте безопасный случайный ключ для всего приложения (ключ сеанса).
  • Когда пользователь вводит свою кодовую фразу, используйте ее для расшифровки своего ключа данных, а затем немедленно повторно зашифруйте это с помощью ключа сеанса и сохраните его в своем сеансе или в файле cookie. Отдельно сохраните временную метку в сеансе, отмечая, когда ключ был зашифрован, и подпишите это, создав хэш из временной метки, ключа зашифрованных данных и ключа сеанса.

Когда они хотят просмотреть некоторые данные, то:

  • Извлеките ключ зашифрованных данных, временную метку и хэш подписи из сеанса. Пересчитайте хэш на основе метки времени, ключа зашифрованных данных и ключа сеанса и убедитесь, что он соответствует хэшу из сеанса (т. Е. Что ничего не было подделано).
  • Сравните временную метку с ‘now’ и решите, достаточно ли это недавно, чтобы вы могли ей доверять (т. Е. что она не была украдена злоумышленником в середине атаки).
  • Тогда и только тогда, когда все в порядке, расшифруйте ключ данных с помощью ключа сеанса.
  • Используйте ключ data для расшифровки данных.

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

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

Надеюсь, это поможет.

Ответ №2:

Я думаю, что лучший способ — использовать зашифрованное хранилище файлов cookie. Вы можете найти более подробную информацию об этом в этой статье :

Зашифрованные файлы cookie хранятся здесь и здесь

Здесь, github проекта.