如何处理内存中的React Native Sensitive字符串信息



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

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

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

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

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

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

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

MDN 的内存管理

如果您使用文本类型的TextInput将其更改为密码类型,并且在任何情况下,如果您将用户名密码存储在异步存储中,请不要这样做。

最新更新