use*_*384 5 memory security react-native
最近安全团队通知我内存中存储有\xe2\x80\x99s敏感数据/密码。
\n\n对于密码输入,I\xe2\x80\x99m 使用 TextInput onChangeText 对密码字符串执行 setstate,然后将其传递到 API 服务负载(具有密码字符串的对象)以对用户进行身份验证。与 redux 和 redux thunk 一起使用。
\n\n安全团队建议将字符串更改为字符数组。I\xe2\x80\x99m 不知道如何处理,因为最终我仍然需要将密码字符串传递给 API 有效负载,因此敏感密码字符串仍将存储在内存中。另一个建议是加密字符串,是否可以在内存中执行此操作?我\xe2\x80\x99在发送API调用之前对其进行了加密,但我\xe2\x80\x99m不确定如何在内存中对其进行加密。
\n\n为了检测内存中的字符串,我\xe2\x80\x99m 使用越狱的 iPhone 和 fridump 转储内存,并使用 -s 标志将字符串提取到文本文件。
\n首先,简单说一下“安全问题”。这里的警告是,用户输入密码后,显然包含在设备内存中(甚至还没有像另一个答案所建议的那样位于磁盘上,而是内存在 RAM 中)。由于 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(垃圾收集器) )清除字符串,因为对它的引用(将字符串保存在其中的变量)超出了范围并且无法再访问