java - DTLS 与使用 JKS/JCE 加密 UDP 数据报的比较

标签 java udp datagram jce dtls

我需要 Java 中的加密 UDP 连接。 我了解 DTLS,但它在 Java 中存在问题。所以我更喜欢使用 JKS 或 JCE 进行自己的加密。 为什么选择UDP?一些丢失的数据包或重新排序与我无关,但延迟却与我有关。 到目前为止我有这样的概念:

服务器创建一个临时的对称加密 key (对于 session 来说是唯一的),用客户端的公钥对其进行加密(非对称加密)并将其发送给客户端。在 session 的其余部分,它们仅与使用对称 key 加密的数据报进行通信。

与 DTLS 相比,使用此方法有哪些缺点?速度?安全性?

最佳答案

这听起来就像您正在尝试重新发明 DTLS。你说DTLS有问题,但这是为什么呢?

理论上你的逻辑是合理的。它让我想起了带有 RSA key 交换的 DTLS:

  • 客户端 -> ClientHello(共享ClientRandom)
  • 服务器 -> ServerHello(共享ServerRandom)
  • 服务器 -> 证书(共享证书,包含服务器公钥以及其他内容)
  • 客户端 -> KeyExchange(共享使用服务器公钥加密的 Pre-Master Secret)

现在双方都有:ClientRandomServerRandom(它们是公共(public)知识)和Pre-Master Secret(仅通过网络共享)非对称加密。只有证书的所有者知道从网络通信中解密Pre-Master Secret所需的私钥,因此客户端验证服务器发送的证书非常重要。

DTLS 确定从 Pre-Master SecretClientRandomServerRandom 生成 Master Secret 的方法以及来自Master Secret的对称加密/MAC key 。 DTLS 使用 Pre-Master Secret 而不是直接共享 Master Secret 以实现模块化。从安全角度来看,直接共享Master Secret应该同样安全。从技术上讲,ClientRandomServerRandom 在 key 生成中用作盐。这保证了双方参与者都对盐的加密安全性有发言权。

生成对称加密 key 后,参与者在结束握手之前进一步验证他们是否可以使用它们进行通信。

使用 CBC 时,加密数据包本身的形式为:

[ IV ] + encrypted( [ Data blocks ] [ HMAC ] [ Padding ] )

随每个数据包发送初始化 vector 会增加一些传输开销,但可以防御某些选定的明文攻击。然而,这只是针对不同攻击的安全措施之一。有效的 (D)TLS 实现有很多不同的细微差别:忽略或隐藏错误条件、确保操作即使失败也需要恒定的时间,等等。

因此,虽然 DTLS 的安全理念可以概括为“将公钥共享给一个参与者。使用非对称加密传输对称 key 。使用对称 key 加密通信”,但还有很多小细节可以确保其安全。当人们发明自己的安全措施时,这些小细节通常会失败。

通过验证证书可以减少有效的 MITM 攻击 - 当然,在上述握手中,只有客户端验证服务器身份。如果您需要服务器验证客户端身份,客户端也需要发送自己的证书等。

关于java - DTLS 与使用 JKS/JCE 加密 UDP 数据报的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25406278/

相关文章:

java - Play! 中的抽象模型界面ORM,如何加载 initial-data.yml?

java - Leetcode 351 Android 解锁模式

java - rxJava 通过过滤器列表删除列表元素

python - 看不到来自另一台设备的 UDP 多播消息

java - 如何正确比较从数据报包接收到的字符串值?

java - 为什么 RuntimeException 不能从 Throwable 分配?

Android RTSP/UDP "RTSP/1.0 461 Unsupported transport"通过蜂窝网络 (4G)

java - 接收数据报包

java - 如何将DatagramPacket发送到多个IP地址?

java - Android/Java 上的数据报传输层安全性 (DTLS)