Android Firebase实时数据库内部数据表示

Android Firebase实时数据库内部数据表示,android,database,sqlite,firebase,firebase-realtime-database,Android,Database,Sqlite,Firebase,Firebase Realtime Database,故事 我有一个Android应用程序,它严重依赖Firebase实时数据库。到目前为止,我使用它没有任何问题 但是我需要在数据库中存储用户的一些高度敏感的数据,我不希望以纯文本的形式这样做 因此,在将数据存储到数据库之前,我对数据进行了加密。我可以在Firebase控制台中看到加密字符串 问题 我需要检查和验证数据是如何在本地设备中由Firebase数据库内部表示的,因为我正在数据库中存储加密密钥 我的数据库有setPersistenceEnabled(),因此Firebase将这些数据本地存储

故事

我有一个Android应用程序,它严重依赖Firebase实时数据库。到目前为止,我使用它没有任何问题

但是我需要在数据库中存储用户的一些高度敏感的数据,我不希望以纯文本的形式这样做

因此,在将数据存储到数据库之前,我对数据进行了加密。我可以在Firebase控制台中看到加密字符串

问题

我需要检查和验证数据是如何在本地设备中由Firebase数据库内部表示的,因为我正在数据库中存储加密密钥

我的数据库有
setPersistenceEnabled()
,因此Firebase将这些数据本地存储在用户设备中。没有提到Firebase是如何在内部实现这一点的。它是否将其存储为JSON文件或SQLite数据库(最有可能)

我的尝试

为了深入研究这个问题,我尝试从我的应用程序中提取数据库

我曾经

"adb -d shell "run-as com.yourpackge.name ls /data/data/com.yourpackge.name/databases/"
在我的终端中获取我的应用程序的所有数据库名称的列表,这是我得到的

app-debug-xxxx.firebaseio.com_default
app-debug-xxxx.firebaseio.com_default-journal
crash_reports
crash_reports-journal
这些是我的数据库,对吗?它们是常规SQLite数据库吗?假设这些文件是SQLite数据库,我无法从中读取数据

我个人认为,对于我们来说,了解数据在安卓系统中的内部表示方式非常重要,这样我们就可以做出更好的决策来存储数据


非常感谢您的帮助。

检查完您提到的文件后,是的,它确实是一个SQLite数据库文件(
app.firebaseio.com\u default

数据保存在
serverCache
表中,它包含两列:
path
(文本)和
value
(BLOB)
path
是firebase数据库中数据的路径,类似于
/users/-KOasdbcde
,而
是该路径的JSON值

编辑

这是那张桌子的结构

检查完您提到的文件后,是的,它确实是一个SQLite数据库文件(
app.firebaseio.com_default

数据保存在
serverCache
表中,它包含两列:
path
(文本)和
value
(BLOB)
path
是firebase数据库中数据的路径,类似于
/users/-KOasdbcde
,而
是该路径的JSON值

编辑

这是那张桌子的结构

谢谢你的回答。你能详细说明一下吗?不同嵌套节点的数据结构如何?如果你能解释一下,你是如何从这些文件中读取数据的,那就更好了?@AritraRoy我已经用表格中的内容的屏幕截图更新了我的答案。我使用这个应用程序,但如果你经常使用桌面,也可以使用。谢谢。这让我对Firebase的内部数据结构有了更多的了解。实际上,我已经加密了数据,但是还需要在这个数据库中保留加密密钥。但这可以让任何人找到密钥,然后解密数据。你能建议一些更好的方法吗?嗨@AritraRoy,看起来你需要自己的后端来保存密钥。我没有比这更好的主意,因为你启用了磁盘持久性,并且在手机中启用root访问权限的用户可以读取该数据库。但这仍然会使应用程序仅在联机时访问其数据。脱机时,我将无法呼叫后端并获取密钥。谢谢您的回答。你能详细说明一下吗?不同嵌套节点的数据结构如何?如果你能解释一下,你是如何从这些文件中读取数据的,那就更好了?@AritraRoy我已经用表格中的内容的屏幕截图更新了我的答案。我使用这个应用程序,但如果你经常使用桌面,也可以使用。谢谢。这让我对Firebase的内部数据结构有了更多的了解。实际上,我已经加密了数据,但是还需要在这个数据库中保留加密密钥。但这可以让任何人找到密钥,然后解密数据。你能建议一些更好的方法吗?嗨@AritraRoy,看起来你需要自己的后端来保存密钥。我没有比这更好的主意,因为你启用了磁盘持久性,并且在手机中启用root访问权限的用户可以读取该数据库。但这仍然会使应用程序仅在联机时访问其数据。离线时,我将无法调用后端并获取密钥。firebaser在这里,Android上的磁盘缓存确实存储在sqlite数据库中。虽然您可能可以对该数据库中的数据结构进行反向工程,但它是故意未记录的,并且可能会随着时间的推移而更改,而不另行通知。唯一有文档记录的访问数据的方法是通过Firebase SDK for Android。我理解这一点。但是,是否可以通过对数据库文件进行反向工程来读取数据?实际上,我在存储数据之前对数据进行了加密,但密钥也存储在数据库中。在这方面,我如何确保更好的安全性?非常感谢您的帮助?将密钥存储在数据库中是不安全的。更好的方法是使用系统密钥库生成的密钥对加密密钥。看到一个什么是使用这个的最小API了吗?firebaser这里Android上的磁盘缓存确实存储在一个sqlite数据库中。虽然您可能可以对该数据库中的数据结构进行反向工程,但它是故意未记录的,并且可能会随着时间的推移而更改,而不另行通知。唯一有文档记录的访问数据的方法是通过Firebase SDK for Android。我理解这一点。但是,是否可以通过对数据库文件进行反向工程来读取数据?实际上,我在存储数据之前对数据进行了加密,但密钥也存储在数据库中。霍