rdi*_*z82 8 security android apk
我正在开发一个Android应用程序,我必须通过一对私钥和公钥来维护与服务器的安全通信.哪个是在我的apk中存储私钥的最安全的方法?显然我要对代码进行模糊处理,但我想要更多的安全性.我想到了以下选项:
如果我用签名事务信息的方法创建一个本机共享库,那么apk只需要包含.so文件,这个文件是机器码,所以反编译可能很困难,不是吗?
有任何想法吗?谢谢
小智 5
将密钥对存储在密钥库中,并将密钥库作为资源包含在 APK 中。Android 倾向于使用BouncyCastle Key Store (BKS)格式。密钥库是专门为此目的而设计的。
请注意,您应该使用密码保护密钥库,并且您的应用程序需要知道该密码才能访问密钥库。因此,您需要向用户询问密码才能访问密钥库或将密码包含在代码中(对其进行混淆以使攻击者更难进行逆向工程)。如果有人不厌其烦地对您的应用程序进行逆向工程以恢复加密的密钥库和访问它所需的密码,那么将该密码包含在已编译的本机库中不会带来太多额外的障碍。
但是,无论如何您可能都不需要这样做。如果您的目标是保护/加密与服务器之间传输的数据,请使用 SSL/TLS。如果您不进行客户端身份验证,则您的服务器需要 SSL 证书,但您的客户端不需要;该协议负责以安全的方式为您生成加密密钥。如果您确实希望服务器对客户端进行身份验证(使您的服务器仅与您的客户端通信),您需要在您的应用程序中安装客户端 SSL 证书...这是您的私钥大概在想。
我还将向您介绍Android 平台的应用程序安全性。这本书(免责声明:我写了这本书)有一整章讨论如何设计安全的 Android 应用程序到服务器通信,并用代码示例来说明如何实现适当的保护。您可能想读一读。
首先,为了实现客户端应用程序和服务器之间的安全通信,从概念上讲,您只需要服务器的公钥。这允许您与服务器建立单向信任关系并建立安全会话,在该会话中保证服务器的身份。
虽然上述方法当然不提供双向信任(客户端无法被服务器识别),但在大多数应用程序中建立通信通道时,实际上并不需要这种级别的信任。
如果您的要求是使用公钥/私钥向服务器提供客户端身份验证,那么事情会变得更加复杂,因为如果您将密钥放入 apk 中,无论您对其进行多少混淆(包括将其嵌入本机库中),它都只会减慢专门的恶意用户的速度。
客户端存储私钥的唯一方法是对其进行加密。但是,您也会遇到类似的问题,即在哪里存储解密密钥。最简单的解决方案是为客户端应用程序的用户生成公钥/私钥对,并要求用户提供对称加密/解密密钥(用户始终必须输入该密钥)以在每次使用时解密私钥。用户正在使用该应用程序。
另一种方法是使用某种类似于智能卡的专用加密硬件设备,它可以安全地存储私钥,但您仍然存在授权应用程序从设备读取密钥的问题(更不用说接口的复杂性了)与所述设备)。
现在,您必须问自己的问题是:“您想阻止谁读取私钥?” (当然在回答另一个问题之后:“您真的需要客户端的公钥/私钥对”)。
| 归档时间: |
|
| 查看次数: |
3071 次 |
| 最近记录: |