【问题标题】:Android how to handle sensitive data in memoryAndroid如何处理内存中的敏感数据
【发布时间】:2015-08-29 23:30:43
【问题描述】:

请问我有以下情况:

应用程序使用密码通过 HTTPS 访问某些远程 Web 服务;

为此,应用会询问用户密码,不会将其存储在设备上(并以安全的方式使用它来访问网络服务)。

我担心的是:理论上可以访问内存以读取其中包含的数据并最终检索密码。

请问我该如何防止这种情况发生?

谢谢

【问题讨论】:

  • 可能对密码进行哈希和加盐?
  • 除其他安全措施外,将密码存储在 char[] 而不是 String,然后在使用后覆盖 char[]:stackoverflow.com/questions/8881291/…
  • @samgak 真是个好主意!谢谢!

标签: android security passwords


【解决方案1】:

请问我该如何防止这种情况发生?

我出于职业原因戴锡箔帽(此外,我认为它们看起来很漂亮......),这超出了我通常担心的范围。我担心你的 HTTPS 代码不会成为中间人 (MITM) 攻击的受害者,因为这对攻击者来说更容易执行。

话虽如此,正如 samgak 在评论中提到的那样,String 是不可变的。一旦密码在 String 中,您就有遭受您描述的攻击的风险。

如果您使用EditText 来收集密码,请不要调用getText().toString() 来获取用户输入的内容。getText() 将返回一个Editable,它允许您获取字符,而不是@ 987654327@。然后,如果你的 HTTP 客户端 API 允许你使用 char[] 填写密码,一旦 HTTP 请求完成,你可以清除 char[]clear()Editable 的内容,然后祈祷EditText 和 kin 并没有在任何地方保留代表用户输入内容的 String。这可能因设备而异,因为设备制造商长期以来一直在纠缠EditText 行为,等等就 AOSP 代码而言可能干净的部分在某些制造商的硬件上可能不太干净。

如果您通过其他方式获取密码(例如,您自己的一组 PIN 输入按钮),请避免使用 String 表示结果,并在完成后清除 char[] .

【讨论】:

    【解决方案2】:

    是的,理论上可以,当物理访问设备时。至少可以调试应用程序并在编码/解码时捕获任何点的值,即它是打开的。

    但更简单的方法是在用户输入密码时自行捕获用户输入。所以,你不必担心内存溢出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-22
      • 2021-11-14
      • 1970-01-01
      • 2022-12-15
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      相关资源
      最近更新 更多