繁体   English   中英

这是在apk中包含一对密钥(公共/私有)的最安全方法

[英]which is the safest way to include a pair of key (public/private) in a apk

我正在为Android开发应用程序,并且必须通过一对私钥和公钥与服务器保持安全通信。 将私钥存储在我的apk中最安全的方法是什么? 显然,我将混淆代码,但我需要更高的安全性。 我想到了以下选择:

如果我使用用于签名交易信息的方法创建本机共享库,则apk仅必须包含.so文件,并且此文件位于机器代码中,因此反编译可能很困难,不是吗?

有任何想法吗? 谢谢

将密钥对存储在密钥库中 ,并将密钥库作为资源包含在APK中。 Android倾向于使用BouncyCastle密钥存储(BKS)格式。 密钥库是专门为此目的而设计的。

请注意,您应该使用密码保护密钥库,并且您的应用程序将需要知道该密码才能访问密钥库。 因此,您只需要要求用户输入密码来访问密钥库或将密码包含在代码中即可(对密码进行混淆处理,使攻击者更难进行反向工程)。 如果有人要对工程进行反向工程,以恢复您的加密密钥库和访问它所需的密码(包括已编译的本机库中的密码),则不会带来很多额外的障碍。

但是,您可能仍然不需要这样做。 如果您的目标是保护/加密与服务器之间的数据传输,请使用SSL / TLS。 如果您不进行客户端身份验证,则服务器需要SSL证书,但客户端不需要。 该协议负责以安全的方式为您生成加密密钥。 如果您确实希望服务器对客户端进行身份验证(使其进行身份验证,以便服务器仅与客户端通信),则需要在应用中安装客户端SSL证书...这是您要使用的私钥大概在想。

我还将为您指出Android平台的应用程序安全性 本书(免责声明:我写过这本书)整整一章都在讨论如何设计安全的Android应用程序到服务器通信,并提供代码示例来说明如何实施适当的保护。 您可能需要阅读一下。

首先,为了实现客户端应用程序和服务器之间的安全通信,从概念上讲,您仅需要服务器的公钥。 这样一来,您就可以与服务器建立单向信任关系,并建立安全的会话,从而保证服务器的身份。

尽管上述方法当然不能提供双向信任(无法向服务器标识客户端),但是在大多数应用程序中建立通信通道时,实际上并不需要这种信任级别。

如果您的要求是使用公钥/私钥向服务器提供客户端身份验证,则事情会变得更加复杂,因为如果您将密钥放在apk中,则无论您对其进行多大程度的混淆(包括将其嵌入本机库中),它都只会放慢了专门的邪恶用户的速度。

与客户端一起存储私钥的唯一方法是对其进行加密。 但是随后,您在存储解密密钥的位置也遇到了类似的问题。 最简单的解决方案是为客户端应用程序的用户生成一个公钥/私钥对,并要求用户提供一个对称的加密/解密密钥(用户将始终必须键入该密钥)以在每次加密时解密私钥。用户正在使用该应用程序。

另一种选择是使用类似于智能卡的某种专用加密硬件设备,该设备可以安全地存储私钥,但是您仍然存在授权应用程序从设备读取密钥的问题(更不用说接口的复杂性了)与所述设备)。

现在,您必须问自己的问题是: “您试图阻止谁读取私钥?” (当然,在回答了另一个问题之后: “您是否真的需要为客户端提供公钥/私钥对” )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM