有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

两个移动设备之间的java安全连接:SSL密钥非“专用”

我使用自签名证书和使用openssl生成并存储在密钥库中的密钥在运行同一应用程序的两个Android设备之间使用SSL。 问题是私有密钥库必须以某种方式嵌入到应用程序包中,因此任何攻击者都可以使用。我相信这将允许攻击者窥探会话并解密两部手机之间的数据

我没有使用或需要PKI的任何其他功能,我只是提供了两个密钥库,因为SSL连接设置需要它们

是否有一种安全的SSL密码不需要预定义的PKI,并在运行时动态生成自己的密钥

我已经研究过在运行时生成我自己的密钥——在Java中创建密钥很容易,但密钥存储库不需要。setEntry()需要X509证书链,而不仅仅是公钥,Android不包含生成X509的JCE代码。我可以通过包括BouncyCastle(Android兼容版本称为SpongyCastle)库来实现这一点,但这会给我的应用程序包大小增加相当大的开销

无法访问internet上的第三方信任服务器,这两部手机可能位于无法访问internet的专用WLAN上

作为一个很好的奖励,我希望能够相信应用程序正在与自身通信,而不是有人从PC嗅探协议,但我认为这是不可能的,因为应用程序包的内容将始终可用


共 (1) 个答案

  1. # 1 楼答案

    为了确保你正在与你信任的人/事交谈,你需要一种验证对方身份的机制。我不知道有什么方法可以在没有数据保密的情况下实现这一点:

    • 非对称身份验证(即您当前的实现)要求私钥数据保持私有

    • 对称身份验证要求共享机密保持私有

    将来,TrustZone将允许应用程序在手机的安全元件中存储机密数据。然而,在此之前,您的设备上始终存在恶意软件的风险。将密码添加到您的密钥库(用户知道,而不是应用程序知道)可能会给攻击者增加额外的障碍,但是一旦手机被感染,密码就可以被窥探

    为了最大限度地降低风险,您应该生成每个设备的密钥,而不是将单个证书/密钥对组合合并到应用程序中。当然,这将增加添加新用户所需的工作量,因为需要某种形式的注册(例如,验证其密钥)。或者,你可以把问题推给你的用户,让他们决定信任谁,PGP风格