5

我对加密一无所知。但我需要它。如何?

假设您有一个通过异步消息在网络上相互通信的节点系统。节点不维护有关其他节点的会话信息(这是设计限制)。

假设您想确保只有您的节点可以读取正在发送的消息。我相信加密是解决这个问题的方法。

由于节点不维护会话并且通信必须以无状态、无连接的方式工作,我猜测非对称加密被排除在外。

所以这就是我想做的事情:

  • 消息作为 UDP 数据报发送
  • 每条消息都包含一个时间戳以使消息不同(反重放攻击)
  • 每条消息都使用共享秘密对称密钥加密并通过网络发送
  • 另一端可以使用共享秘密对称密钥解密

密钥显然可以通过破坏任何单个节点来破坏。同时,在这种情况下,访问任何一个受感染的节点无论如何都会揭示所有有趣的信息,因此密钥不是最薄弱的环节。

我应该使用什么密码进行此加密?什么密钥长度?

我更喜欢使用ezPyCrypto支持的东西。

假设,正如大多数人指出的那样,我使用 AES。我应该使用哪些模式?

我不知道如何用 ezPyCrypto 来做,PyCrypto似乎挂在主持人交换上,谷歌的keyczar没有解释如何设置 - 我担心如果我不明白,那么我会冒险引入不安全感。所以准系统会更好。这家伙声称在 python 中有一个很好的 AES 模块,但他也声称这是他的第一个 python 项目 - 尽管他可能比我更聪明,但也许他被绊倒了?

编辑:我将对 python 实现的搜索移至另一个问题以停止破坏...

4

7 回答 7

8

我对加密一无所知。但我需要它。如何?

危险!如果您对密码学不太了解,请不要尝试自己实现它。密码学很难正确。除了实际破解密钥(这通常非常困难)之外,还有许多不同的方法可以破坏密码系统的安全性。

如果您只是对您的流数据进行加密,而没有仔细的密钥管理和对密码系统微妙之处的其他理解,您很可能会面临各种漏洞。例如,您描述的方案将容易受到中间人攻击,而没有针对节点之间的密钥分配的特定计划,并且可能容易受到选择明文和/或已知明文攻击,具体取决于您的分布方式系统与外界通信,以及密码和操作模式的准确选择。

所以......在安全使用它之前,你必须阅读一般的加密货币。

于 2008-10-07T15:24:37.257 回答
7

您首先想到的应该是通道安全性——SSL/TLS 或 IPSec。
诚然,这两者都有一定的设置开销,IPSec 比 SSL/TLS 更多,尤其是在 PKI 等方面 - 但它在开发的简单性、可靠性、安全性等方面为自己付出了更多。只要确保您使用适合协议的强密码套件即可。

如果 SSL/TLS 或 IPSec 都不适合您的场景/环境,那么您的下一个选择应该是AES(又名 Rijndael)。
如果您愿意,可以使用至少 256 位长的密钥。
密钥应该由加密安全的随机数生成器(而不是简单的 rnd() 调用)随机生成。
将密码模式设置为CBC
使用 PKCS7 填充。
生成一个唯一的、加密随机初始化向量 (IV)。不要忘记正确保护和管理您的密钥,并可能考虑定期密钥轮换。

根据您的数据,您可能还希望实现键控散列,以提供消息完整性 - 使用SHA-256进行散列。

在极少数情况下,您可能想要使用流密码,但这通常更复杂,我建议您在第一次使用时避免使用它。

现在,我不熟悉 ezpycrypto(或者说真的是一般的 python),并且不能真正声明它支持所有这些;但是这里的所有内容都是非常标准的并且推荐的最佳实践,如果您的加密库不支持它,我建议找到一个支持它的;-)。

于 2008-10-05T18:52:23.160 回答
4

假设使用对称加密,那么 AES 应该是您的默认选择,除非您有充分的理由选择其他方式。

选择 AES 进行了一场漫长而激烈的竞争,最终获胜者是经过精心挑选的。甚至加密货币之神 Bruce Schneier 也表示,AES 获胜者是比他提交给比赛的算法(TwoFish)更好的选择。

于 2008-10-05T18:46:12.920 回答
3

AES 256 通常是首选,但根据您的位置(或您客户的位置),您可能会受到法律限制,并且将被迫使用更弱的东西。

另请注意,您应该为每次通信使用随机 IV 并将其与消息一起传递(这也将节省对时间戳的需求)。

如果可能,尽量不要依赖算法,并将算法与消息一起传递。然后节点将查看标头,并决定将用于解密的算法。这样,当某个部署需要它时,您可以轻松地切换算法。

于 2008-10-05T18:39:01.547 回答
1

我可能会选择AES

于 2008-10-05T18:26:22.680 回答
1

非对称加密也适用于这种情况。只需让每个节点发布它的公钥。任何想要与该节点通信的节点只需要使用该节点的公钥加密消息。使用非对称密钥的一个优点是更容易更改和分发密钥——因为公钥可以公开分发,每个节点只需要更新它的公钥-私钥对并重新发布。您不需要整个网络(或每个节点对)的某些协议来就新的对称密钥达成一致。

于 2008-10-05T18:42:31.040 回答
1

为什么不在必须安全通信的节点之间创建一个 VPN?

然后,您不必费心编写自己的安全解决方案,并且您不限于静态的共享密钥(如果泄露,将允许在事后解密所有捕获的流量)。

于 2008-10-05T18:49:11.463 回答