使用什么对称密码加密消息?

5 投票
7 回答
2837 浏览
提问于 2025-04-11 09:23

我对加密一点都不懂,但我需要用到它,怎么办呢?

假设你有一套节点,它们通过异步消息在网络上互相通信。这些节点不保存其他节点的会话信息(这是设计上的限制)。

假如你想确保只有你的节点能读取发送的消息,我觉得加密是解决这个问题的方法。

由于这些节点不维护会话,并且通信必须在无状态、无连接的情况下进行,我猜想不适合使用非对称加密。

所以我想做的是:

  • 消息以UDP数据报的形式发送
  • 每条消息包含一个时间戳,以使消息不同(防止重放攻击)
  • 每条消息用一个共享的对称密钥加密后发送到网络上
  • 另一端可以用共享的对称密钥解密

显然,任何单个节点被攻破后,密钥就会被泄露。同时,在这种情况下,访问任何一个被攻破的节点都会暴露所有重要信息,所以密钥并不是最弱的环节。

我应该用什么加密算法呢?密钥长度应该是多少?

我希望使用一些ezPyCrypto支持的东西。

假设大多数人提到的,我选择AES。那么我应该使用什么模式呢?

我搞不清楚如何用ezPyCrypto来实现,PyCrypto似乎在换版过程中卡住了,而谷歌的keyczar也没有解释如何设置这个——我担心如果我不明白,就有可能引入安全隐患。所以简单点会更好。这个人声称他有一个不错的Python AES模块,但他也说这是他的第一个Python项目——虽然他可能比我聪明得多,但也许他会遇到问题?

编辑:我把对Python实现的搜索移到了另一个问题上,以避免混淆...

7 个回答

4

如果你使用的是对称加密,那么AES应该是你的首选,除非你有很好的理由选择其他的加密方式。

为了选出AES,经历了一场漫长而复杂的比赛,最终的获胜者是经过仔细挑选的。甚至连加密领域的大咖布鲁斯·施奈尔都表示,AES这个获胜者比他自己提交的算法(TwoFish)更好。

7

我对加密一点都不了解,但我需要它。该怎么办呢?

注意! 如果你对密码学了解不多,最好不要自己去实现。密码学是非常复杂的,想要做到正确很难。破解一个加密系统的安全性有很多种方法,而不仅仅是破解密钥(这通常是非常困难的)。

如果你只是简单地在你的数据流上加一个加密算法,而没有好好管理密钥或者理解加密系统的细微之处,你可能会面临各种安全漏洞。例如,你描述的方案如果没有一个特定的密钥分配计划,就会容易受到中间人攻击,而且根据你的分布式系统如何与外界通信,以及你选择的加密算法和操作模式,可能还会受到选择明文攻击和/或已知明文攻击的威胁。

所以……在你能够安全使用加密之前,你需要先了解一些关于密码学的基础知识。

7

首先,你需要考虑的是通道安全性——可以选择SSL/TLS或者IPSec。
这两者确实需要一些设置,尤其是IPSec比SSL/TLS更复杂,特别是在公钥基础设施(PKI)方面。不过,这些设置带来的好处是值得的,它们能让开发变得更简单、提高可靠性和安全性等。只要确保使用强加密套件,适合你选择的协议就行。

如果SSL/TLS和IPSec都不适合你的情况,接下来可以考虑AES(也叫Rijndael)。
建议使用至少256位长的密钥,如果需要的话可以更长。
密钥应该是随机生成的,使用一个安全的随机数生成器,而不是简单的rnd()调用。
设置加密模式为CBC
使用PKCS7填充。
生成一个唯一的、加密随机的初始化向量(IV)。
别忘了妥善保护和管理你的密钥,考虑定期更换密钥。

根据你的数据情况,你可能还想实现一个带密钥的哈希,以确保消息的完整性——可以使用SHA-256进行哈希处理。

还有一些少见的情况,你可能会想使用流加密,但这通常更复杂,建议你第一次不要尝试。

我对ezpycrypto(或者说Python)不太熟悉,不能确定它是否支持这些功能;不过这里提到的都是比较标准和推荐的最佳实践。如果你的加密库不支持这些功能,建议你找一个支持的库;-)

撰写回答