Как шифровать данные пользователя в Firebase

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

Итак, мой поток будет примерно таким:

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

Ответ 1

Вы можете легко сделать это следующим образом:

  • После того, как пользователь на своем телефоне сгенерирует логическую партию открытого открытого ключа. например: использовать Ecc Curve25519
  • Закрытый ключ от A надежно хранится на его телефоне.
  • Открытый ключ из A хранится в firebase и доступен для всех, кто беседует с A.
  • Если X отправляет сообщение A, он извлекает открытый ключ из A из firebase, зашифровывает сообщение для A локально и сохраняет зашифрованное сообщение на firebase в папке "Входящие" с A
  • Загружает зашифрованное сообщение из firebase и расшифровывает его своим личным ключом, хранящимся на телефоне

(наоборот, от A до X)

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

  • Попросите A определить надежный пароль для шифрования его локально сохраненного закрытого ключа. (или создать произвольную кодовую фразу и использовать QR-коды для обмена ключами)
  • Зашифруйте закрытый ключ локально (например: используйте AES256) на своем телефоне с паролем с шага 1 и загрузите его в firebase. (необязательно подпишите его своим личным ключом)
  • Загрузите зашифрованный закрытый ключ со второго устройства из A
  • Запросить кодовую фразу на втором устройстве от A и безопасно хранить секретный ключ (необязательно проверить подпись с открытым ключом из A)
  • Удалить зашифрованный закрытый ключ из firebase, если не требуется резервное копирование.

Ответ 2

Я нашел очень интересную статью об этом, написанную Ande Geers

Он объясняет, как шифровать данные и расшифровывать их, а также как защитить созданный ключ.

http://www.geero.net/2017/05/how-to-encrypt-a-google-firebase-realtime-database/

Возможно, вам стоит взглянуть на него.