2017-06-16 173 views
0

我在我的Android应用程序在某些领域使用的专用API密钥 - 是有没有办法阻止用户不知何故逆向工程或反编译了Java看到,关键是什么?将键作为静态字段放在类中是不安全的吗?将它作为strings.xml中的字符串资源更安全吗?还是其他什么东西?或者是否无法阻止充分积极的用户找到它?可以反编译我的应用程序以显示字符串常量吗?

+3

这一个:*它根本不可能阻止充分动机的用户找到它* ...您仍然可能以某种方式混淆,因此在反编译后不会立即可用 – Selvin

+1

[混淆代码中的隐藏字符串] (https://stackoverflow.com/questions/4427238/hiding-strings-in-obfuscated-code)和[看这里(https://stackoverflow.com/questions/22949801/simple-hiding-obfuscation-of-strings -in-apk)太 –

+1

@Pavneet_Singh:很好找。 –

回答

3

不仅可以它是,它甚至没有硬。

您可以通过不把它作为一个字符串在所有更难做,但作为一系列数字,你转换为字符串在运行时(也许混淆它在某种程度上)。

但答案

或者是根本不可能的,以防止有足够的动机用户从寻找它?

是:是的,这是根本不可能的。

+0

你能更详细一点与“一系列的数字”的例子吗?即使不停止最确定的操作,我也可以添加几层保护。我宁愿不是低垂的果实。 – KaliMa

+0

@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)});'同样:对于某人来说这并不难,但是在你的类文件中字符串不会是明文的。 :-) –

+0

所以你定义'a1'随意,然后用字符'B'异或它得到'INT a2'? – KaliMa

-1

最好将String作为常量包含在类文件中,并使用String obfuscation和其他各种使用某些免费或商用混淆器的技术对其进行混淆。这是你能做的最好的事情,你会得到很大的节约。您可以通过反编译来仔细检查自己,并尝试找到密钥,就好像您不知道密钥一样。你会看到你的保护有多好。

+0

你有没有遇到[Schneier定律](https://www.schneier.com/blog/archives/2011 /04/schneiers_law.html)?不能够恢复自己的秘密不告诉你其他人是否可以。 –

+0

@AndyTurner: 如果你经历了明显的攻击,看起来绝望,你至少做了一个体面的工作。当然,这是不可能的,以保证没有人会成功,但一些混淆器是非常聪明的搞乱反编译输出和喜欢 – BullyWiiPlaza

+0

最好的希望那些坏人坚持只使用明显的攻击! –

相关问题