Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在apk中包含一对密钥(公共/私有)最安全的方法是什么_Android_Security_Apk - Fatal编程技术网

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

Android 在apk中包含一对密钥(公共/私有)最安全的方法是什么,android,security,apk,Android,Security,Apk,我正在为android开发一个应用程序,我必须通过一对私钥和公钥与服务器保持安全通信。在我的apk中存储私钥最安全的方法是什么?很明显,我会混淆代码,但我需要更多的安全性。我曾考虑过以下选择: 如果我用签名事务信息的方法创建一个本机共享库,apk只需要包含.so文件,而这个文件是机器代码,因此反编译可能会很困难,不是吗 有什么想法吗? 首先,为了在客户端应用程序和服务器之间实现安全通信,从概念上讲,您只需要服务器的公钥。这允许您与服务器建立单向信任关系,并建立一个安全会话,其中服务器的身份得到保

我正在为android开发一个应用程序,我必须通过一对私钥和公钥与服务器保持安全通信。在我的apk中存储私钥最安全的方法是什么?很明显,我会混淆代码,但我需要更多的安全性。我曾考虑过以下选择:

如果我用签名事务信息的方法创建一个本机共享库,apk只需要包含.so文件,而这个文件是机器代码,因此反编译可能会很困难,不是吗

有什么想法吗?
首先,为了在客户端应用程序和服务器之间实现安全通信,从概念上讲,您只需要服务器的公钥。这允许您与服务器建立单向信任关系,并建立一个安全会话,其中服务器的身份得到保证

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

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

在客户端存储私钥的唯一方法是对其进行加密。但是你也有一个类似的问题,就是在哪里存储解密密钥。最简单的解决方案是为客户机应用程序的用户生成公钥/私钥对,并要求用户提供对称加密/解密密钥(用户必须始终键入该密钥),以便在用户每次使用应用程序时解密私钥

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


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

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

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

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


我也会指给你看。这本书(免责声明:我写了这本书)有一整章讨论如何设计安全的Android应用程序到服务器的通信,并附有代码示例来说明如何实现适当的保护。您可能需要对其进行阅读。

在您的威胁模型中,谁是攻击者?您设备的合法用户?攻击者不会攻击该用户,问题是该应用程序将访问支付服务,我们需要一个安全的应用程序。在一个简单的apk中,任何人都可以反编译、获取密钥并使用它们访问支付系统。你应该设计你的应用程序,让拥有应用程序完整源代码和所有嵌入密钥的用户不会做任何坏事。你的回答为解决问题开辟了不同的途径。尽管存在混淆,但我认为密钥库的密码在代码中仍然可见,因此访问密钥库并不困难。这是事实。然而,这是最好的。如果设备上运行的客户端应用程序需要访问它存储的内容,则具有该设备访问权限的人也可以访问它。你所能做的一切都会使它变得更加困难。当然,您不能存储密码并在每次需要访问密钥时强制用户键入密码。不是一个理想的用户体验,但密码必须来自某个地方。这是一个大问题!我需要保护客户端证书。该应用程序用于购买,客户端(使用该应用程序的任何人)和服务器之间的所有交易都必须签名。恐怕任何人都可以提取证书并开始向服务器发送有效的事务。然后,您需要向用户询问每个事务的密钥库密码。您需要在设计应用程序/系统时假设您的应用程序APK中包含的任何内容都可以由愿意付出时间/精力的人恢复。因为这个假设是正确的。从扫描的二维码中获取密钥库的密码,然后通过post“像银行一样”发送给用户,或者直接在服务器上的