可以反编译我的应用程序以显示字符串常量吗? [复制]
Posted
技术标签:
【中文标题】可以反编译我的应用程序以显示字符串常量吗? [复制]【英文标题】:Can my app be decompiled to reveal string constants? [duplicate] 【发布时间】:2017-11-19 08:39:58 【问题描述】:我的 android 应用程序中有一个私有 API 密钥,用于某些领域 - 有没有办法阻止用户以某种方式对 Java 进行逆向工程或反编译以查看该密钥是什么?将密钥作为静态字段放在类中不安全吗?将其作为字符串资源放在 strings.xml 中是否更安全?还是完全不同的东西?还是根本不可能阻止有足够动力的用户找到它?
【问题讨论】:
这个:根本不可能阻止有足够动力的用户找到它 ...您可能仍然会以某种方式混淆它,因此在反编译后它不会立即可用 Hiding strings in Obfuscated code 和 look here 也可能重复 @Pavneet_Singh:很好的发现。 如果你使用proguard,那么你可以把它写成String,proguard可以在一定程度上保护你的API密钥。 @T.J.Crowder 感谢您的赞赏,只是向像您这样的优秀成员学习 【参考方案1】:不仅可以做到,甚至不难。
您可以通过根本不将其存储为字符串,而是将其存储为一系列数字来使其更难,然后在运行时将其转换为字符串(也许以某种方式对其进行混淆)。
但是答案
或者根本不可能阻止有足够积极性的用户找到它?
是:对,根本不可能。
【讨论】:
你能用“数字序列”的例子详细说明一下吗?我可以添加几层保护,即使它不会阻止最坚定的人。我宁愿不要成为唾手可得的果实。 @KaliMa:嗯,那个特定的例子可能是相当低调的。例如,假设您的字符串是"bqzT"
。您可以将其存储为int a1 = 0x5348e823; int b1 = 0x902b77b2; int c1 = 0xaff50d8b; int d1 = 0x2bf6eacc; int a2 = 0x5348e841; int b2 = 0x902b77c3; int c2 = 0xaff50df1; int d2 = 0x2bf6ea98;
并用String s = new String(new char[] (char)(a1 ^ a2), (char)(b1 ^ b2), (char)(c1 ^ c2), (char)(d1 ^ d2) );
重新构造它:这对某人来说并不是特别难弄清楚,但该字符串在您的类文件中不会是明文。 :-)
所以你任意定义a1
然后用字符b
异或得到int a2
?
@KaliMa:是的。 (我反其道而行之,但使用 xor 时,结果都是一样的。:-))【参考方案2】:
最好将String
作为常量包含在类文件中,并使用String obfuscation
和使用一些免费或商业混淆器的各种其他技术对其进行混淆。这是你能做的最好的,你会相当省钱。您可以通过反编译并尝试找到密钥来仔细检查自己,就好像您不知道它一样。你会看到你的保护有多好。
【讨论】:
你遇到过Schneier's Law吗?无法恢复自己的秘密并不能说明其他人是否可以。 @AndyTurner:如果您经历了明显的攻击并且看起来毫无希望,那么您至少做得不错。当然,不可能保证没有人会成功,但是一些混淆器在弄乱反编译器输出等方面非常出色 希望那些坏人坚持只使用明显的攻击!以上是关于可以反编译我的应用程序以显示字符串常量吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章