请我有以下情况:
该应用程序使用密码通过HTTPS访问某些远程Web服务;
为此,应用程序会询问用户密码,不会将其存储在设备上(并以安全的方式使用它来访问 Web 服务)。
我担心的是:从理论上讲,访问内存以读取其包含的数据并最终检索密码是可能的。
请问我该如何防止这种情况发生?
谢谢
请问我该如何防止这种情况发生?
我在专业的基础上戴锡箔帽(此外,我认为它们看起来很时髦......),这超出了我通常担心的范围。我担心让你的HTTPS代码不会成为火星中间人(MITM)攻击的受害者,因为这对攻击者来说更容易执行。
话虽如此,正如 samgak 在评论中提到的那样,String
是不可变的。一旦密码在 String
中,您将面临您所描述的攻击的风险。
如果使用EditText
来收集密码,请不要调用getText().toString()
来获取用户键入的内容。 getText()
将返回一个 Editable
,它允许您获取字符,而不是String
。然后,如果您的 HTTP 客户端 API 允许您使用char[]
填写密码,则 HTTP 请求完成后,您可以清除char[]
的内容,clear()
Editable
,然后祈祷EditText
和亲属不会在代表用户输入内容的任何地方保留String
。这可能因设备而异,因为设备制造商长期以来一直在搞砸EditText
行为,因此在 AOSP 代码方面可能干净的内容在某些特定制造商的硬件上可能不太干净。
如果您通过其他方式(例如,您自己的一组PIN输入按钮)获取密码,只需避免结果的String
表示,并在完成后清除char[]
。
是的,理论上可以物理访问设备。至少可以调试应用程序并在编码/解码时在任何点捕获值,即它是打开的。
但更简单的方法是在用户输入密码时捕获用户输入本身。因此,您无需担心内存碎片。