Flutter — хранилище ключей для сквозного шифрования на нескольких устройствах
Я пишу флаттер-приложение, в котором пользователь может создавать заметки. Я написал код для создания закрытого ключа для пользователя, который позже используется для шифрования его данных. Зашифрованные данные хранятся в Firebase Firestore. Когда их данные извлекаются, они расшифровываются с использованием их ключа.
Я рассмотрел использование Flutter Secure Storage, которое отлично работает, за исключением того, что секретный ключ доступен только на этом устройстве. Если пользователь войдет в систему на новом устройстве, он не сможет расшифровать свои заметки.
Мой вопрос:
Как/где я могу хранить секретный ключ пользователя для расшифровки его данных, чтобы только они имели к нему доступ, независимо от того, с какого устройства они входят в систему? Какова наилучшая практика в отношении такого решения?
final AesGcm algorithm = AesGcm.with256bits();
final SecretKey secretKey = await algorithm.newSecretKey();
// TODO: Write secretKey to storage that only the user can access with their account.
1 ответ
Как объяснил Дэвид в выступлении Virgil Security на GDG , эта проблема решается путем использования пароля пользователя для получения ключа (который Дэвид называет мозговым ключом ), который затем используется для шифрования закрытого ключа пользователя. Итак, когда пользователь регистрируется, для него создается закрытый ключ, который затем шифруется с помощью ключа мозга. Этот зашифрованный ключ-пароль хранится в облаке.
Таким образом, когда пользователь входит в систему с нового устройства, он вводит свой пароль и получает ключ мозга из пароля, который затем используется для расшифровки их закрытого ключа и, следовательно, сохраняется на устройстве пользователя. Теперь вам может быть интересно, что произойдет, если пользователь изменит свой пароль. Чтобы изменить свой пароль, требуется старый пароль, который затем используется для создания нового ключа мозга и хранения закрытого ключа в зашифрованном формате.