Сначала несколько слов о "проблеме безопасности". Предупреждение здесь заключается в том, что пароль, введенный пользователем, очевидно, содержится в памяти устройства (даже не на диске, как было предложено в другом ответе, но в памяти, как в ОЗУ). Поскольку Javascript выполняется в JSC, который в основном является программой на C ++, строковое приложение JS, создаваемое во время работы, хранится в куче - разделе памяти, куда отправляются все необработанные данные. Для упрощения, когда вы вводите «hello world» в качестве пароля, строка «hello world» создается и сохраняется как целое где-то в этой куче. Когда вы сбрасываете память устройства, вы можете отсканировать ее в поисках hello world
последовательности, которую вы только что ввели, и сделать вывод, что приложение «небезопасно», если вы его обнаружите
Это реальная проблема безопасности? Я не считаю это одним, потому что если у злоумышленника есть доступ к памяти устройства другого пользователя для «чтения незашифрованных паролей», то, скорее всего, ему даже не нужно этого делать, поскольку есть гораздо более простые способы украсть этот пароль (запись экран или касания, или нажатия клавиш, или сетевой трафик c, например). Большинство приложений никогда не заботятся об этом, так как большая часть безопасности (в данном случае безопасность памяти) обычно обрабатывается операционной системой (например, гарантируя, что один процесс не может просто прочитать другую память процесса так просто) , Эти правила безопасности обычно применяются к программам более низкого уровня, которые запускаются не на мобильном устройстве, а, например, на банкоматах или серверах, где существует реальный риск физического подключения злоумышленника к устройству и сброса памяти незамеченным.
Давайте обсудим, как вы все еще можете избежать этой так называемой уязвимости, чтобы удовлетворить вашу команду безопасности. Один из самых простых способов - вместо сохранения пароля в одной строке сохранить его в массиве, поэтому вместо hello world
(одна строка в куче) у вас есть ["h", "e", "l", "l", "o", " ", "w", "o", "r", "l", "d"]
(9 различных однобуквенных строк (см. в качестве «символов» в других языках) хранится где-то случайно в куче с одним объектом массива, содержащим ссылку на каждую из этих строк). Теперь, если вы сбросите память, вы не сможете найти там свой первоначальный пароль, потому что он разбросан повсюду. Как вы реализуете это в React native? Вместо хранения пароля где-нибудь в состоянии в виде строки, используйте массив. В onChangeText добавляйте или удаляйте элементы из этого массива, избегайте объединения всей строки до тех пор, пока вам действительно не понадобится отправить ее на сервер. Чтобы звездочки правильно отображались в вашем TextInput, вы можете создать поддельную строку, так как она все равно будет замаскирована, и единственное, что вас волнует, это на самом деле только длина этого массива, так что вы можете нарисовать такое же количество звездочек в TextEdit. Конечно, окончательная конкатенация всей строки (почти) неизбежна, так как вам все еще нужно отправить ее на сервер, но окно для этой строки должно быть относительно коротким - от создания запроса и его отправки до точки, когда G C (сборщик мусора) очищает строку, так как ссылка на нее (переменная, которая содержала эту строку внутри нее) находится вне области видимости и больше не доступна
Управление памятью в MDN