在 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
Cordova
在iOS
中存在相关问题。
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 中安全地存储访问令牌的主要内容,如果未能解决你的问题,请参考以下文章
如何安全地存储 Discord(OAuth2) 用户的访问令牌?