ate*_*iob 8 java encryption android decompiling reverse-engineering
Android和Java提供了一个加密API,相对来说非常容易用于加密非专家.
但是既然我们知道没有任何代码可以真正受到保护免受逆向工程,特别是用作种子或共享机密的字符串常量,我想知道:在Android应用程序中经历加密和解密的磨难有什么意义?
我错过了什么吗?
试图让我的问题更清晰,更具体:假设我已经在使用特定字符串的应用程序通过代码,在代码(即没有用户数据)必须是秘密的:一种方法是将它们存储在加密的形式在编译.apk并在运行时解密它们(使用模糊的硬编码密码).另一种方法是将它们以加密形式存储在远程服务器中,在运行时获取它们(通过Internet)并解密(使用共享密码)它们.
我认为两者之间没有太大的区别,因为两者都要求(反向工程)代码中存在"密钥".
有这个问题的解决方案吗?
如果没有解决方案,为什么要加密?
这不是Android或Java的严格问题.任何事情都可以逆转,如果是原生代码,那就更难了.请记住,他们甚至不必扭转它:你必须最终解密内存上的数据来操纵它.此时,攻击者可以进行内存转储,他们将获取您的数据.如果他们可以物理访问设备,并且您正在操作软件中的数据,那么您无法阻止它们.对此的解决方案是使用防篡改或至少防篡改的专用硬件模块(HSM)(如果有人混淆它,它要么删除所有数据,要么至少保留事件的一些日志).那些有不同的形状和大小,从智能卡到网络,成本连接的设备很多.目前不适用于Android,但它可能会得到类似于TPM的东西,因此您可以安全地存储密钥并在硬件中进行加密操作.
因此,请考虑您的数据需要多大的秘密,并确定适当的保护级别.
您可能希望通过SSL下载它(在传输过程中保护它),确保您对服务器进行身份验证(因此您知道从受信任的地方获取正确的数据)和客户端(因此您可以确定您只是将数据提供给合适的人).您可以为此使用SSL客户端身份验证,它将比您(或任何不是加密专家的人)可能附带的任何自定义加密/密钥交换方案更安全.