场景:
假设您有一个使用服务器上某些API的Android应用程序。
该应用程序没有登录功能(由于用户在服务器上没有任何个人数据,因此不需要它)
为了将请求发送到服务器,请在服务器上创建OAuth2功能。您向服务器发出请求,它返回一个Auth Token。
但是如果用户监视网络请求,则可以很容易地接受此请求。因此,您创建了一个与Auth请求的POST正文一起发送的密钥。
问题从这里开始:
您创建的此密钥必须保留在应用程序中,并且应用程序中的任何代码都可以分解(反编译),并且可以访问该密钥。
密钥不能在服务器上,否则将需要获取密钥,因此可以对其进行监视。
您无法以任何方式对其进行编码,因为解码功能必须在Android方面,因此可以反编译。
问题:
是否有可能至少使秘密密钥更难解码?
P.S:使用R8或Proguard仅会使代码模糊。如果黑客或攻击者进行了尝试,他们可以轻松查看应用程序的整个代码,并可以继续了解编码或解码的流程,或者在代码内找到密钥。
绝对不是解决方案,尽管有一些商业解决方案提供了一些锁盒式的实现,但是以较小的规模却无法证明成本是合理的。因此,如果我们想做一些干净,整洁和便宜的事情,这就是我的建议。
[在Android中,借助A ndroid Native Development Kit (NDK)
,我们获得了本机语言的支持。另外,Android中有JNI(Java Native Interface)
。 JNI定义了一种从Java或Kotlin代码生成的字节码与本机代码(即用C或C ++编写的代码)交互的方式。
因此,在Android NDK
的帮助下,我们可以保护API密钥。根据Android Studio的版本,我们提供了三种方法来保护API密钥:
您应该进一步探索三种实现方式中的任何一种。