我正在制作一个从服务器下载数据的 android 应用程序,我已经实现了一个存储来自服务器的数据的 sqlite 数据库和一个内容提供程序,所有这些都是为了让应用程序在没有互联网连接的情况下工作。问题是应用程序需要用户登录才能工作,这需要互联网连接,所以问题是允许用户在没有连接的情况下登录的最佳方式是什么?因为我认为如果用户无法在没有互联网的情况下访问它,那么拥有一个无需连接即可运行的应用程序是没有意义的。我考虑过将登录该设备的用户和密码存储在 sqlite 数据库中,就像存储服务器数据并从那里检查一样,但这安全吗?提前致谢:)
最佳答案
喜欢缓存登录凭据吗?
您正在使用一些基于强密码的 key 推导(如 pbkdf2)将密码存储在服务器上 - 如果用户成功“登录”,为什么不在您的本地生成另一个密码的强盐+强哈希副本SQLite 数据库,所以即使没有可用的互联网连接,您也可以重新验证用户(直到某个到期日期)? (您应该在一段时间后过期该缓存的凭据集 - 需要再次连接互联网才能继续。48 小时或对我来说似乎是正常的。)
这就是你想要的吗?
这主要意味着如果有人窃取或以其他方式获得对手机 SQLite 数据库的访问权限,他们将拥有散列密码。因此,请确保它尽可能安全地存储。 (网上有很多 - 看看 NIST 关于这个主题的出版物;永远不要隐含地信任你在网上找到的代码......)如果这个密码足够强大,就不会丢失任何东西。
(如果用户的“在线”密码被迫每 90 天轮换一次,并且破解缓存副本需要 90 多天 - 什么都不会丢失。)
您的登录代码的实现将首先尝试联系服务器进行身份验证 - 如果失败,它将检查是否有本地缓存的尚未过期的凭据,并针对这些凭据进行本地身份验证(使用类似于您的代码服务器端)。
关于android - 使用 sqlite 数据库和内容提供程序在应用程序中进行登录设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33648584/