【问题标题】:How variables are stored after compilation?编译后变量如何存储?
【发布时间】:2018-02-21 16:31:13
【问题描述】:

我的程序(用 Java 编写)中有一个变量:

String myPassword

用 Android Studio 编译代码后,我得到一个 android 应用程序,我想让其他人使用它。

但我很害怕:用户是否有可能从应用程序中获取变量值(密码)?

假设密码值为“myPass”。它的二进制是:

01101101 01111001 01010000 01100001 01110011 01110011

应用程序二进制文件中会包含这个序列吗?

【问题讨论】:

  • 是的,可以通过检查编译后的二进制文件或在运行时在内存中查找它来实现。不要将敏感信息存储在任何可公开访问的地方。
  • 非常感谢您的回复@AlexK。那我该怎么办?
  • 您不能分发包含密码的应用程序并确保密码安全。这是不可能的。人们可以反编译你的代码;或者他们可以只观察应用程序正在做什么,然后等待它使用密码。
  • 您需要想出一个不涉及在您的应用程序中硬编码密码的身份验证方案,例如Android: Storing username and password?
  • 还有关于 Java 密码的有用信息:stackoverflow.com/questions/8881291/…

标签: java compilation


【解决方案1】:

例如,如果您使用 javap -c -p -constants 反编译您的类,您会看到这些字符串:

public class DeleteMe {

   private static final String test = "def";

   public static void main(String[] args) {
      String test = "abc";
   }
}

会产生(重要的两行):

private static final java.lang.String test = "def";
ldc           #2                  // String abc

否则,在您的应用程序中存储密码真的很糟糕,通常人们会使用某种数据库来保存密码。

还有the must read 关于Stringchar[] 的密码。

【讨论】:

  • 感谢您的回复。假设我想连接到包含包含密码的表的数据库。我必须使用凭据连接到数据库: Connection conn = DriverManager.getConnection("url", "user", "passwd");所以如果我这样做,“用户”字符串和“密码”字符串是否受到保护?
  • @NewWorker 老实说,我不是 android 开发人员,所以我不知道 android 的最佳实践是什么,但我认为有一些方法可以非对称加密密码,例如 Android 密钥库(这个是谷歌告诉我的)...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多