react-native - 如何处理内存中的 React Native 敏感字符串信息

标签 react-native security memory

最近安全团队通知我内存中存储了敏感数据/密码。

对于密码输入,我使用 TextInput onChangeText 在将密码字符串传递给 API 服务负载(带有密码字符串的对象)以对用户进行身份验证之前对其进行设置状态。与 redux 和 redux thunk 一起使用。

安全团队建议将字符串更改为字符数组。我不知道该怎么做,因为最后我仍然需要将密码字符串传递给 API 负载,因此敏感的密码字符串仍将存储在内存中。另一个建议是加密字符串,甚至可以在内存中执行此操作吗?我在发送 API 调用之前对其进行了加密,但我不确定如何在内存中对其进行加密。

为了检测内存中的字符串,我使用带有 fridump 的越狱 iPhone 来转储内存,并使用它和 -s 标志将字符串提取到文本文件中。

最佳答案

首先,关于“安全问题”的几句话。这里的警告是,密码在用户输入后,显然包含在设备内存中(甚至不像另一个答案所建议的那样在磁盘上,而是在内存中)。由于 Javascript 在 JSC 中运行,JSC 基本上是一个 C++ 程序,因此应用程序在操作时创建的 JS 字符串存储在堆中 - 所有原始数据所在的内存部分。为简单起见,当您输入“hello world”作为密码时,“hello world”字符串将被创建并作为一个整体存储在该堆的某个地方。当您转储设备内存时,您可以扫描它以查找 hello world您刚刚输入的序列并得出结论,如果您发现该应用程序“不安全”

这是一个真正的安全问题吗?我不认为这是一个,因为如果入侵者可以访问另一个用户的设备内存以“读取未加密的密码”,那么他甚至不需要这样做,因为有更简单的方法来窃取该密码(记录例如,屏幕、触摸、键盘敲击或网络流量)。大多数应用程序从不关心这种事情,因为大多数安全性(在这种情况下是内存安全)通常由操作系统处理(例如,通过确保一个进程不能那么容易地读取另一个进程内存) .这些安全准则通常适用于不在移动设备上运行而是在 ATM 或服务器上运行的较低级别的程序,在这些程序中存在入侵者物理插入设备并在未引起注意的情况下转储内存的实际风险。

让我们讨论您如何仍然可以避免这种所谓的漏洞以满足您的安全团队。最简单的方法之一是,不是将密码存储在单个字符串中,而是将其存储在数组中,而不是 hello world (堆中的单个字符串)您有 ["h", "e", "l", "l", "o", " ", "w", "o", "r", "l", "d"] (9 个不同的单字母字符串(在其他语言中称为“字符”)随机存储在堆中的某个位置,其中一个数组对象包含对每个字符串的引用)。现在,如果您转储您的内存,您将无法在其中找到您的初始密码,因为它散落在各处。你如何在 React Native 中实现它?使用数组代替以字符串形式将密码存储在状态中的某处。在 onChangeText 从该数组追加或删除项目时,避免将整个字符串连接在一起,直到您确实需要将其发送到服务器。为了让星号正确出现在您的 TextInput 中,您可以创建一个假字符串,因为无论如何它都会被屏蔽掉,并且您唯一关心的只是该数组的长度,因此您可以在其中绘制相同数量的星号文字编辑。当然,最后连接整个字符串是(几乎)不可避免的,因为您仍然需要将其发送到服务器,但是该字符串的窗口应该相对较短 - 从构造请求并将其发送到 GC(垃圾收集器) ) 清除字符串,因为对它的引用(您在其中保存字符串的变量)超出范围并且不再可访问

Memory Management on MDN

关于react-native - 如何处理内存中的 React Native 敏感字符串信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60663811/

相关文章:

java - XSS 过滤器以删除所有脚本

python - 在Python中使用静态地址和偏移量从进程读取内存地址

iOS - 内存和保留/释放问题

c++ - 在 CUDA 中高效地初始化共享内存阵列

reactjs - 如何在 react-native 中呈现 Html 并更改数据?

javascript - 如何在 React-native 中获取 NavigatorIOS 的 'child controllers' 引用?

c# - 在 WCF 中使用 Windows 身份验证类型时,用户名和密码是否以纯文本形式发送?

Linux:在没有副本的情况下更改文件所有权?

layout - 当连续多个文本组件时,React Native 处理省略号

javascript - 无法将没有 YogaNode 的子级添加到没有测量函数的父级