Dav*_*uel 6 android firebase firebase-authentication
我正在阅读文档,但我找不到 SDK 如何在设备上保留刷新令牌,以便能够在应用程序被终止时保持用户身份验证。
我想了解的是:
有人对此有任何见解吗?
创建一个集成 Firebase Auth 的小型演示应用程序并检查它后,我想我找到了我正在寻找的东西:
\nSharedPreferencesFirebase Auth 用于SharedPreferences缓存与经过身份验证的 Firebase 用户相关的所有信息。
存储在SharedPreferences对象中的数据将写入应用程序内部存储目录中的纯文本 XML 文件。该文件可以在以下位置找到:
/data/data/{app_package_name}/shared_prefs/com.google.firebase.auth.api.Store.{hash}.xml\nRun Code Online (Sandbox Code Playgroud)\n该文件包含两个键值对,它们都包含刷新令牌:
\ncom.google.firebase.auth.FIREBASE_USER:/data/data/{app_package_name}/shared_prefs/com.google.firebase.auth.api.Store.{hash}.xml\nRun Code Online (Sandbox Code Playgroud)\ncom.google.firebase.auth.GET_TOKEN_RESPONSE.{hash}:{\n "cachedTokenState": "{\\"refresh_token\\":\\"AIwUa...\\",\\"expires_in\\":3600,\\"token_type\\":\\"Bearer\\",\\"issued_at\\":1651836746042}",\n "applicationName": "[DEFAULT]",\n "type": "com.google.firebase.auth.internal.DefaultFirebaseUser",\n "userInfos": [\n "{\\"userId\\":\\"sDa2XJk...\\",\\"providerId\\":\\"firebase\\",\\"email\\":\\"user@email.com\\",\\"isEmailVerified\\":false}",\n "{\\"userId\\":\\"user@email.com\\",\\"providerId\\":\\"password\\",\\"email\\":\\"user@email.com\\",\\"isEmailVerified\\":false}"\n ],\n "anonymous": false,\n "version": "2",\n "userMetadata": {\n "lastSignInTimestamp": 1651836746972,\n "creationTimestamp": 1651579404681\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n安全影响:
\n非 root 设备中的其他应用程序无法访问存储文件的应用程序的内部存储目录,并且它在 Android 10 或更高版本的设备中进行了加密(因为现在强制执行基于文件的加密)。SharedPreferences
Android 的自动备份会在运行 Android 6 或更高版本的设备上自动将应用程序的内部存储目录备份到 Google Drive。在运行 Android 9 或更高版本的设备上,使用设备的 PIN、图案或密码对备份进行端到端加密。
\n基于上述情况,刷新令牌可能会在以下情况下(至少)受到损害:
\nSharedPreferences存储刷新令牌的 XML 文件。adb backup,加密备份文件是可选的。如果备份未加密并且恶意行为者获得了备份文件的访问权限,他就可以从中提取刷新令牌。潜在的缓解措施:
\nSharedPreferences文件。但如果您需要完全遵守OWASPMSTG-STORAGE-1规则:
\n\n系统凭证存储设施需要用于存储敏感数据,例如 PII、用户凭证或加密密钥。
\n
那么您唯一的选择是使用 Firebase 身份验证 REST API 而不是使用其 SDK,并使用适当的加密存储(例如EncryptedSharedPreferences )自行保留刷新令牌。
\n否则,您可以考虑一些默认情况下在其 SDK 中支持加密的替代提供商,例如:
\n\n此测试是针对 Firebase Auth v21.0.3 执行的,该版本是撰写本文时的最新版本。
\n更新: \n我发现Firebase 团队关于他们的方法的声明:
\n\n\n至于命名的 SharedPreferences 文件,
\ncom.google.firebase.auth.api.Store.{code}.xml实际上就是我们保存用户状态的地方。当应用程序进入后台或关闭时,当前登录的用户需要存储在某个地方,而 SharedPreferences 是一个安全的地方 - 它具有私有文件系统权限,这意味着只有该应用程序(或具有 root 权限的进程)权限)可以读取它。因此,加密是没有必要的。一般来说,Firebase 只对未 root 的、非用户调试的设备提供安全保证;root 或 userdebug 设备的安全属性显着降低,而我们无法正确解释。不过,问题仍然存在,为什么我们不加密存储中的内容?答案非常简单:它不提供额外的安全性(除了隐匿性安全性之外),并且会降低性能和复杂性。例如,root 用户还可以作为目标应用程序访问 Android 密钥库,这意味着他们仍然可以读取 SharedPreferences,他们只需首先读取并使用适当的密钥即可。
\n
| 归档时间: |
|
| 查看次数: |
772 次 |
| 最近记录: |