在 Cordova 中安全地存储访问令牌

Posted

技术标签:

【中文标题】在 Cordova 中安全地存储访问令牌【英文标题】:Securely store access token in Cordova 【发布时间】:2016-07-23 05:01:53 【问题描述】:

编辑: 请参阅我的answer 以获得解决方案

目前正在使用Ionic 开发一个混合应用程序,其中需要存储身份验证令牌以保持用户登录,并保证无法在应用程序上下文之外访问此数据。

当然,这项任务有很多解决方案,每个解决方案都有不同的优缺点,因此(对我而言)很难找到适合的技术。

我一直在关注angular-localForage 和其他候选人:


本地存储

小数据的明显选择。 当系统内存不足时,ios 中的数据会被擦除。

索引数据库

iOS (IndexedDB support) 中的错误支持

WebSQL (SQLite)

对于小数据和体面的支持 (WebSQL suppport) 显然是一个不错的选择,但它已被弃用。

SQLite

CordovaiOS 中存在相关问题。

LokiJS

在这种情况下看起来有点矫枉过正,但绝对是一个强有力的候选者。是否有任何我应该注意的安全问题(当我在本地读取它时将数据持久化到 JSON 文件中)?

PouchDB + SQLite

嗯,它是一个与 CouchDB 或 Couchbase 数据库一起使用的 JS 客户端,它也可以与 SQLite 一起使用,但我只需要存储一个 Token..

显然,具有讽刺意味的是,android/iOS 交叉兼容性的最佳选择应该是 WebSQL,但它已不再开发,我必须保证长期支持。

所以我的问题是:我还缺少其他安全存储访问令牌的选项吗?如果没有,以上哪一个应该是这项任务的最佳选择?

【问题讨论】:

我知道这个问题已经得到解答,但是 LokiJS 有一个 cryptoFsAdapter 可以存储加密的 JSON。 @JoeMinichino 谢谢,我会研究一下。 【参考方案1】:

SQLite 是最好的选择,因为 DB 的内容将被加密和保存。原生应用程序也依赖 SQLite 来保存数据。 为了使用 SQLite 使 CRUD 更容易,我创建了一个包装库。请查收here

【讨论】:

据我所知 SQLite 可以加密,但您必须在客户端代码中的某处公开硬编码的密码。【参考方案2】:

去LocalStorage,这是最好的存储方式

【讨论】:

正如我所评论的,当内存不足时,LocalStorage 在 iOS 上会被擦除。 并且可能无法在应用中本地存储access_token 和/或refresh_token LocalStorage 本身不会使令牌安全【参考方案3】:

在做一些研究后,我将分享我的结论。

有趣的是,以上候选者都不适合安全地存储访问令牌。该方法应该为 Android (Shared Preferences) 和 iOS (Keychain) 使用原生解决方案。

在 Ionic 的特殊情况下,Cordova 的 broadcaster plugin 可用于将 JS 与 Native 通信,以便您可以访问存储的数据。

【讨论】:

谢谢,这篇文章没有得到它需要的关注。如果您能多解释一下如何从 Android(共享首选项)和 iOS(钥匙串)保存和检索数据,那就太好了。我找不到好的指南! 回答为什么不安全 - ***.com/questions/18144414/… 回答使用什么代替(没有检查)-github.com/pradeep1991singh/cordova-plugin-secure-key-store ionicframework.com/docs/native/secure-storage【参考方案4】:

唯一安全的方法是使用“httponly cookie”。但是,自 2020 年 4 月起,Apple 使用的 wkwebview 存在 cookie 问题。

【讨论】:

以上是关于在 Cordova 中安全地存储访问令牌的主要内容,如果未能解决你的问题,请参考以下文章

安全地存储访问令牌

OAuth 2.0 在哪里安全地存储访问令牌以供长期使用

如何安全地存储 Discord(OAuth2) 用户的访问令牌?

加密,然后将访问令牌存储在 localStorage

在本机 IOS 应用程序中加载多个 Cordova 微应用程序

为命令存储访问和刷新令牌