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