【问题标题】:Secure connection between two mobile devices: SSL key not 'private'两台移动设备之间的安全连接:SSL 密钥不是“私人”的
【发布时间】:2023-11-10 19:40:01
【问题描述】:

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

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

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

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

无法访问 Internet 上的第三方信任服务器,两部手机可能位于无法访问 Internet 的私有 WLAN 上。

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

【问题讨论】:

  • 我已经建立了这样的基础设施,并愿意分享代码。不幸的是,我在 android 端(*.com/questions/68342319)遇到了麻烦,一旦我解决了这个问题,我会与你分享我的代码。

标签: java android security ssl keystore


【解决方案1】:

为确保您正在与您信任的某事/某人交谈,您需要一种对对方进行身份验证的机制。我不知道在没有数据保密的情况下实现这一目标的方法:

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

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

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

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

【讨论】: