加密连续/小UDP数据的最佳实践

时间:2010-06-14 19:09:20

标签: encryption udp

我有一个应用程序,我必须使用UDP通过网络每秒发送几个小数据。应用程序需要实时发送数据(无需等待)。我想加密这些数据,并确保我所做的事情尽可能安全。

由于我使用UDP,因此无法使用SSL / TLS,因此我必须单独加密每个数据包,因为协议是无连接/不可靠/不受管制的。

现在,我使用的是来自用户的密码短语的128位密钥,以及使用CBC模式的AES(使用AES-CBC的PBE)。我决定使用带密码的随机盐来获取128位密钥(防止对密码短语进行字典攻击),当然还要使用IV(以防止对数据包进行统计分析)。

然而,我担心的事情很少: 每个数据包包含少量数据(如每个数据包的几个整数值),这将使加密数据包容易受到已知明文攻击(这将导致更容易破解密钥)。此外,由于加密密钥来自密码短语,这将使密钥空间更少(我知道盐将有所帮助,但我必须通过网络发送盐一次,任何人都可以得到它)。鉴于这两件事,任何人都可以嗅探并存储发送的数据,并尝试破解密钥。虽然这个过程可能需要一些时间,但一旦密钥被破解,所有存储的数据都将被解密,这对我的应用程序来说将是一个真正的问题。

所以我的问题是,使用无连接协议(UDP)发送/加密连续小数据的最佳做法是什么? 我的方式是最好的方式吗? ...流入? ...过度破坏?

请注意,我不是要求100%安全的解决方案,因为没有这样的事情。

6 个答案:

答案 0 :(得分:12)

你有几个选择。您可以使用DTLS,它是适用于数据报的TLS版本。它在RFC中指定,并在openssl库中实现。您还可以使用IKE / IPsec协议并使用IPsec部分的UDP封装。通常,IPsec在操作系统级别可用。您还可以使用OpenVPN,它看起来是用于密钥交换的TLS和基于UDP的专有数据包加密协议的混合体。

答案 1 :(得分:3)

如果问题是数据太小,那么用随机字节扩展数据怎么样?这将使明文难以猜测。

答案 2 :(得分:0)

这个问题有点陈旧,但使用One Time Pad类型方法呢?您可以使用安全可靠的传输机制(如HTTPS)将一次性密钥从服务器传输到客户端。可能有两组密钥 - 一组用于客户端切断,一组用于服务器到客户端。然后,每个数据报将包括序列号(用于标识一次性密钥),然后包括加密的消息。由于每个密钥仅用于一个数据报,因此不应暴露于小数据问题。也就是说,我不是这方面的专家,所以在使用它之前一定要检查一下这个想法......

答案 3 :(得分:0)

使用Ecdh密钥交换(使用密码加密客户端私钥;留在客户端上)而不是密码。这是一个非常强大的关键。

Aes cbc对你没有帮助;消息太短,您想要防止重播攻击。使用计数器填充64位消息(两个整数)(从0开始)64位表示可以发送2 ^ 64条消息。加密块两次(aes ecb)并发送e(k; m | count)| e(k; e(k; m | count))。接收器仅接受单调递增计数,其中第二个块是第一个块的加密。这些是32字节的消息,适合udp数据包。

如果2 ^ 64条消息太小;看看你的消息是否可以更小(3字节整数表示计数器可以是80位);或者一旦你接近极限(比如2 ^ 64-2 ^ 32),就回到步骤1(至少一方的新私钥)。

答案 4 :(得分:0)

您总是可以生成一对新的 IV 并将它们与数据包一起发送。

答案 5 :(得分:0)

如今,一个好的流密码是要走的路。 ChaCha20 使用 AES 作为密钥流。块密码是需要填充的密码。

那只是图片的一部分。不要推出自己的加密货币。 DTLS 可能是一个成熟的选择。还可以考虑 QUIC,它现在正在网络上普遍可用。