Android 如何处理内存中的敏感数据
Android how to handle sensitive data in memory
请给我以下场景:
该应用使用密码通过 HTTPS 访问某些远程网络服务;
为此,应用程序会询问用户密码,但不会将其存储在设备上(并以安全的方式使用它来访问网络服务)。
我的担忧如下:理论上可以访问内存以读取其中包含的数据并最终找回密码。
请问我该如何防止这种情况发生?
谢谢
是的,理论上是可以的,只要可以物理访问设备。至少可以调试应用程序并在 encoded/decoded 时捕获任何点的值,即它是打开的。
但更简单的方法是在用户输入密码时捕获用户输入本身。因此,您无需担心内存占用问题。
Please how do I prevent this from happening?
我专业戴锡纸帽子(另外,我觉得它们看起来很漂亮......),这超出了我通常担心的范围。我担心让您的 HTTPS 代码不会成为中间人攻击 (MITM) 攻击的受害者,因为这对于攻击者来说更容易执行。
也就是说,正如 samgak 在评论中提到的那样,String
是不可变的。一旦密码在 String
中,您就有遭受您描述的攻击的风险。
如果您使用 EditText
来收集密码,请不要调用 getText().toString()
来获取用户输入的内容。getText()
将 return 一个 Editable
,它允许您获取字符,而不是 String
。然后,如果你的 HTTP 客户端 API 允许你使用 char[]
填写密码,一旦 HTTP 请求完成,你可以清除 char[]
, [=19] 的内容=] Editable
,然后祈祷 EditText
和 kin 不会在代表用户输入内容的任何地方保留 String
。这可能因设备而异,因为设备制造商在 EditText
行为方面有很长的历史,因此在某些制造商的硬件上,AOSP 代码可能是干净的可能不太干净。
如果您通过其他方式获取密码(例如,您自己的一组 PIN 输入按钮),只需避免结果的 String
表示,并在 char[]
时擦除你已经完成了。
请给我以下场景:
该应用使用密码通过 HTTPS 访问某些远程网络服务;
为此,应用程序会询问用户密码,但不会将其存储在设备上(并以安全的方式使用它来访问网络服务)。
我的担忧如下:理论上可以访问内存以读取其中包含的数据并最终找回密码。
请问我该如何防止这种情况发生?
谢谢
是的,理论上是可以的,只要可以物理访问设备。至少可以调试应用程序并在 encoded/decoded 时捕获任何点的值,即它是打开的。
但更简单的方法是在用户输入密码时捕获用户输入本身。因此,您无需担心内存占用问题。
Please how do I prevent this from happening?
我专业戴锡纸帽子(另外,我觉得它们看起来很漂亮......),这超出了我通常担心的范围。我担心让您的 HTTPS 代码不会成为中间人攻击 (MITM) 攻击的受害者,因为这对于攻击者来说更容易执行。
也就是说,正如 samgak 在评论中提到的那样,String
是不可变的。一旦密码在 String
中,您就有遭受您描述的攻击的风险。
如果您使用 EditText
来收集密码,请不要调用 getText().toString()
来获取用户输入的内容。getText()
将 return 一个 Editable
,它允许您获取字符,而不是 String
。然后,如果你的 HTTP 客户端 API 允许你使用 char[]
填写密码,一旦 HTTP 请求完成,你可以清除 char[]
, [=19] 的内容=] Editable
,然后祈祷 EditText
和 kin 不会在代表用户输入内容的任何地方保留 String
。这可能因设备而异,因为设备制造商在 EditText
行为方面有很长的历史,因此在某些制造商的硬件上,AOSP 代码可能是干净的可能不太干净。
如果您通过其他方式获取密码(例如,您自己的一组 PIN 输入按钮),只需避免结果的 String
表示,并在 char[]
时擦除你已经完成了。