网络安全策略
开发应用时安全常常是一个被忽视的话题。的确,搭建一个完全无懈可击的软件是不可能的——我们还没有发明一个完全坚不可摧的锁(毕竟,银行金库已经足够坚固但仍然会被闯入)。然而,遭受恶意攻击或暴露安全漏洞的可能性与您愿意投入保护应用程序免受此类事件的努力成反比。尽管普通的挂锁可以被撬开,但它仍然比橱柜挂钩更难攻破!
在本指南中,您将了解到存储敏感信息、认证、网络安全的最佳实践以及可以帮助您保护应用程序的工具。这不是一个飞行前检查清单——这是一个选项目录,每一个选项都将有助于进一步保护您的应用程序和用户。
保存敏感信息
永远不要在应用代码中存储敏感的API密钥。任何包含在您的代码中的内容都可能被任何人以明文形式访问,只要他们检查了应用包。像react-native-dotenv和react-native-config这样的工具非常适合添加环境特定的变量,比如API端点,但它们不应该与服务器端的环境变量混淆,后者通常可以包含秘密和API密钥。
如果你的应用需要使用API密钥或秘密来访问某些资源,最安全的处理方式是在应用和资源之间构建一个编排层。这可以是一个无服务器函数(例如使用AWS Lambda或Google Cloud Functions),它可以转发带有所需API密钥或秘密的请求。服务器端代码中的秘密不能像应用代码中的秘密那样被API消费者访问。
对于持久化用户数据,请根据其敏感性选择合适的存储类型。 随着你的应用程序的使用,你经常会发现需要在设备上保存数据,无论是为了支持应用程序离线使用、减少网络请求还是保存用户在会话之间的访问令牌,这样他们就不必每次使用应用程序时都重新认证。
持久化与非持久化 —— 持久化数据被写入设备的内存中,这允许数据在应用程序启动后由你的应用程序读取而无需再次进行网络请求以获取它或要求用户重新输入它。但这也可能使这些数据更容易被攻击者访问。非持久化数据从未被写入内存——所以没有可访问的数据!
Async Storage
Async Storage 是一个由社区维护的 React Native 模块,它提供了一个异步、未加密的键值对存储。异步存储不是在应用之间共享的:每个应用都有自己的沙盒环境,并且无法访问其他应用的数据。
使用Async Storage的情况 | 不推荐使用Async Storage的情况 |
---|---|
在应用运行间持久保存非敏感数据 | 令牌存储 |
持久保存 Redux 状态 | 密钥 |
持久保存 GraphQL 状态 |
Async Storage 是 React Native 中与 Web 的 Local Storage 类似的功能
安全存储
React Native 本身没有提供任何用于安全地储存敏感数据的方式。然而,对于 Android 和 iOS 平台来说,已经有现成的解决方案。