我正在开发一个
@L_403_0@应用程序,我必须通过一对私钥和公钥来维护与服务器的安全通信.哪个是在我的apk中存储私钥的最安全的方法?显然我要对代码进行模糊处理,但我想要更多的安全性.我想到了以下选项:
如果我用签名事务信息的方法创建一个本机共享库,那么apk只需要包含.so文件,这个文件在机器码中,所以反编译可能很困难,不是吗?
有任何想法吗?
谢谢
解决方法
将密钥对存储在密钥库中,并将密钥库作为资源包含在APK中. Android倾向于选择BouncyCastle密钥库(BKS)格式. Keystores专门为此目的而设计.
请注意,您应该使用密码保护密钥库,并且您的应用程序需要知道该密码才能访问密钥库.因此,您需要向用户询问密码才能访问密钥库或在代码中包含密码(对其进行模糊处理以使攻击者更难以进行逆向工程).如果有人为您的应用程序进行逆向工程以恢复加密的密钥库以及访问它所需的密码,那么在已编译的本机库中包含该密码将不会带来太大的额外障碍.
但是,无论如何,您可能不需要这样做.如果您的目标是保护/加密与服务器之间传输的数据,请使用SSL / TLS.如果您没有进行客户端身份验证,则您的服务器需要SSL证书,但您的客户端不需要;协议负责以安全的方式为您生成加密密钥.如果您确实希望服务器对客户端进行身份验证(使其服务器只与您的客户端通信),则需要在您的应用程序中安装客户端SSL证书…这是您的私钥可能在想.
我还要指出Application Security for the Android Platform.这本书(免责声明:我写了这本书)有一整章讨论如何设计安全的Android应用程序到服务器通信,并用代码示例来说明如何实现适当的保护.你可能想读一读.