我使用自签名证书和使用openssl生成并存储在密钥库中的密钥,在运行相同应用程序的两个Android设备之间运行SSL。 问题是私有密钥库必须以某种方式嵌入到应用程序包中,因此任何攻击者都可以使用它。我相信这会让攻击者窥探会话并解密两部手机之间的数据。
我没有使用或要求PKI的任何其他功能,我只提供两个密钥库,因为SSL连接设置需要它们。
是否存在安全的SSL密码,它不需要预定义的PKI并在运行时动态生成自己的密钥?
我已经调查过在运行时生成自己的密钥 - 创建密钥很容易在Java中完成,但KeyStore.setEntry()需要一个X509证书链而不仅仅是公钥,并且Android不包含要生成的JCE代码X509。我可以通过包含BouncyCastle(Android兼容版本称为SpongyCastle)库来实现这一点,但这会增加我的应用程序包大小的开销。
互联网上无法访问第三方信任服务器,这两部手机可能位于无法访问互联网的私有WLAN上。
作为一个很好的奖励,我希望能够相信应用程序正在与自己进行通信,而不是有人从PC嗅探协议,但我不认为这是可能的应用包内容将始终可用。
答案 0 :(得分:0)
为确保您与某个您信任的人交谈,您需要一种对另一方进行身份验证的机制。如果没有一个数据保密,我不知道如何实现这个目标:
非对称身份验证(即您当前的实施)要求私钥数据保持私密。
对称身份验证要求共享密钥保持私密。
将来,TrustZone将允许应用程序将秘密数据存储在手机的安全元素中。但是,在此之前,您的设备上始终存在恶意软件风险。向密钥库添加密码(用户知道,而不是应用程序)可能会给攻击者增加额外的障碍,但是一旦手机被感染,就可以窥探密码。
要最大限度地降低风险档案,您应该生成每个设备的密钥,而不是您合并到应用程序中的单个证书/密钥对组合。当然,这将增加添加新用户所需的工作量,因为需要某种形式的注册(例如,证明他们的密钥)。或者,您可以将问题推送给您的用户,让他们决定信任谁,PGP风格。