мой вопрос вкратце: это плохой подход к сохранению пароля пользователя только для сеанса?
Длинная история: я пишу приложение для Android, которое хранит все мои пароли в базе данных Firebase. Пароли должны синхронизироваться между устройствами, то есть, если я вхожу в систему (с помощью Firebase auth) с другого смартфона или с моего веб-сайта, я могу прочитать все свои сохраненные пароли (я должен запомнить только главный пароль). Это работает для меня, но если я хочу поделиться своим приложением с некоторыми друзьями, я мог бы прочитать их пароль, и это не правильно. Поэтому я начинаю поиск в Интернете способа шифрования пароля и сразу после этого сохраняю (зашифровываю) пароли в Firebase.
Я прочитал
https://hackernoon.com/client-side-encryption-in-firebase-database-60dd55abadb2
и http://www.geero.net/2017/05/how-to-encrypt-a-google-firebase-realtime-database/
но все равно не получается как и где хранить симметричный ключ для шифрования / расшифровки пароля.
Я думал об этом решении: когда пользователь входит в систему со своим мастер-паролем, держите пароль внутри Singleton, а когда он хочет сохранить новый пароль, зашифруйте пароль этим ключом (используя некоторую библиотеку AES). Поэтому в Firebase я не могу читать свои пароли или пароли моих друзей. В действии пользователь в режиме реального времени может прочитать все свои зашифрованные пароли и может расшифровать и использовать пароль, извлекая симметричный ключ из Singleton и расшифровывая пароль (с помощью библиотеки AES).
Плохая сторона этого решения заключается в том, что пользователь должен всегда входить в систему каждый сеанс, чтобы я мог хранить его пароль в Singleton. Это плохой подход? Это безопасно? Я мог избежать входа в систему каждый раз, сохраняя мастер-пароль в Android Keystore и используя его. Когда пользователь сменит смартфон, то при следующем входе в систему обновите ключ в Android Keystore. Это может работать на смартфоне Android, но не на веб-сайте (там нет безопасных мест).
Отные подходы:
- Использование некоторого асимметричного шифрования и сохранение закрытого ключа на устройстве пользователя и открытого ключа (и зашифрованного пароля) внутри Firebase. Таким образом, отсутствует синхронизация между устройством (например, смартфоном и веб-сайтом), поскольку на устройстве имеется закрытый ключ.
- Сохраняйте незашифрованные пароли, но я могу их прочитать. Мне не нравится этот путь.
ПРИМЕЧАНИЕ: я знаю, что есть много приложений, которые делают это, но я хочу использовать свое собственное приложение.
Спасибо всем, извините за мой английский.