我在我的Android应用程序在某些领域使用的专用API密钥 - 是有没有办法阻止用户不知何故逆向工程或反编译了Java看到,关键是什么?将键作为静态字段放在类中是不安全的吗?将它作为strings.xml中的字符串资源更安全吗?还是其他什么东西?或者是否无法阻止充分积极的用户找到它?可以反编译我的应用程序以显示字符串常量吗?
回答
不仅可以它是,它甚至没有硬。
您可以通过不把它作为一个字符串在所有更难做,但作为一系列数字,你转换为字符串在运行时(也许混淆它在某种程度上)。
但答案
或者是根本不可能的,以防止有足够的动机用户从寻找它?
是:是的,这是根本不可能的。
你能更详细一点与“一系列的数字”的例子吗?即使不停止最确定的操作,我也可以添加几层保护。我宁愿不是低垂的果实。 – KaliMa
@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
最好将String
作为常量包含在类文件中,并使用String obfuscation
和其他各种使用某些免费或商用混淆器的技术对其进行混淆。这是你能做的最好的事情,你会得到很大的节约。您可以通过反编译来仔细检查自己,并尝试找到密钥,就好像您不知道密钥一样。你会看到你的保护有多好。
你有没有遇到[Schneier定律](https://www.schneier.com/blog/archives/2011 /04/schneiers_law.html)?不能够恢复自己的秘密不告诉你其他人是否可以。 –
@AndyTurner: 如果你经历了明显的攻击,看起来绝望,你至少做了一个体面的工作。当然,这是不可能的,以保证没有人会成功,但一些混淆器是非常聪明的搞乱反编译输出和喜欢 – BullyWiiPlaza
最好的希望那些坏人坚持只使用明显的攻击! –
- 1. 我可以使用字符串作为条件编译常量
- 2. 我可以预编译我的ASP.NET MVC应用程序吗?
- 3. 我可以反编译签名和安装的android应用程序吗?
- 4. 使用Unicode字符集编译的Windows应用程序可以使用编译为多字节的DLL吗?
- 5. 我可以将编译常量传递给项目引用吗?
- 6. Android应用程序 - 可以修改Constants.java中的字符串吗?
- 7. 我可以在protobuf中定义一个常量字符串吗?
- 8. 我可以使用UIDocumentationInteractionController显示应用程序扩展吗?
- 9. 应用程序是否可以反编译?
- 10. MVC Razor RC 1:@section可以用字符串常量定义吗?
- 11. 我可以将我的Silverlight 4应用程序编译为WPF吗?
- 12. ReSharper反编译器 - 我可以将它用于独立程序集吗?
- 13. 我可以通过我的应用程序以编程方式启用GPS吗?
- 14. 我们可以在web应用程序中使用静态字符串吗?
- 15. 应用程序可以编译并创建另一个应用程序吗?
- 16. 你可以静态编译一个cygwin应用程序吗?
- 17. Can Rust宏可以创建编译时字符串吗?
- 18. 我可以使用字符串作为#define的常量部分吗?
- 19. 我可以使用变量字符串来引用列表吗?
- 20. 可以发现已编译的Obj-C应用程序中的“秘密”字符串吗?
- 21. 我可以动态应用Dart的字符串插值吗?
- 22. 我们可以设置字符串吗?
- 23. 我可以调试编译的程序集吗?
- 24. 报告编译时字符串常量
- 25. 我可以使用变量传递json字符串吗?
- 26. 显示快速消息的Iphone应用程序,可以吗?
- 27. 2个应用程序2个时区,我可以编程吗?
- 28. Java:我可以使用常量字符串作为枚举键值吗?
- 29. 用C++编写的Mozilla/GoogleChrome插件可以反编译吗?
- 30. 我可以在我的Qt应用程序中显示qDebug()输出吗?
这一个:*它根本不可能阻止充分动机的用户找到它* ...您仍然可能以某种方式混淆,因此在反编译后不会立即可用 – Selvin
[混淆代码中的隐藏字符串] (https://stackoverflow.com/questions/4427238/hiding-strings-in-obfuscated-code)和[看这里(https://stackoverflow.com/questions/22949801/simple-hiding-obfuscation-of-strings -in-apk)太 –
@Pavneet_Singh:很好找。 –