python - UDP 安全和识别传入数据

标签 python security encryption cryptography udp

我一直在创建一个使用 UDP 传输和接收信息的应用程序。我遇到的问题是安全性。现在我正在使用 IP/socketid 来确定哪些数据属于谁。

但是,我一直在阅读有关人们如何简单地欺骗他们的 IP,然后将数据作为特定 IP 发送的信息。所以这似乎是错误的做法(不安全)。那么我还应该如何识别哪些数据属于哪些用户呢?例如,您连接了 10 个用户,每个用户都有特定的数据。服务器需要将用户数据与我们收到的数据相匹配。

我能看到的唯一方法是使用某种客户端/服务器 key 系统并对数据进行加密。我很好奇其他应用程序(或游戏,因为这就是这个应用程序)如何确保它们的数据是真实的。还有一个事实是,加密的处理时间比未加密的要长得多。虽然我不确定它会对性能产生多大影响。

如有任何信息,我们将不胜感激。谢谢。

最佳答案

一种解决方案是使用 TCP,因为它不会因为 three-way-handshake 而在开放的互联网上欺骗源地址。 (More information 关于为什么 TCP 源地址欺骗不可能。)。如果您仍然想使用 UDP,您可以使用模拟的三向握手来开始连接。然后可以将 session ID 添加到每个 UDP 数据包。这将使连接开销增加 2 个数据包,每个数据包增加几位,但是与 tcp 相比,您仍然可以从 UDP 的剩余 session 速度中获益。

但是,使用 TCP 或 UDP 作为 transport layer仍然让您容易受到其他攻击,例如 SniffingMan in The Middle使用 arp spoofing 进行攻击或 dns cache poising .另一个问题是,如果攻击者和玩家都在同一个本地局域网上,例如无线网络或另一个广播网络,那么无论源/目标地址如何,您都可以接收流量,只有这样欺骗三向握手是否成为可能(hmac 帮不上忙!)。最好的解决方案是使用 SSL/TLS 作为解决所有这些问题的传输层。

你不应该重新发明 wheal,但如果你出于某种原因需要加密 UDP,你应该使用像 RC4-drop1024 这样的流密码,或者更好的像 OFB Mode 中的 AES 256 这样的 block 密码.这将比其他加密模式节省带宽,因为它们四舍五入到最大块大小。

编辑: 基于 Marts 对(数据报传输层安全性)DTLS 的评论,我做了一些挖掘,发现有一个 official RFC并且它受 OpenSSL 支持,应该使用 pyOpenSSL 公开图书馆。我建议使用 RC4-SHA 密码套件来减少开销,该套件受 SSL 3.0(最新)支持。然而,DTLS 可能比 TCP 有更多的开销(LAG!)。

关于python - UDP 安全和识别传入数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2808092/

相关文章:

apache - 如何在代理后面隐藏弱 SSL?

php - 控制试用订阅的访问

haskell - 将 base64-bytestring 与惰性 ByteString 结合使用

python - 如何使用机器人框架获取之前的日期?

python - 从 np.float64 转换为 np.float32 完全改变了一些数字的值

python - 在 Python 中的 3D 球体上绘制圆柱 map 数据

python - numpy 数组元素是否自动舍入?

security - 如何防止代码/程序访问 Web 应用程序?

perl - 在 perl 中使用 Crypt::OpenSSL::RSA 对数据进行签名

c# - CryptDeriveKey 算法名称