我根本没有关于加密的线索。但我需要它。怎么样?
假设您有一个节点系统通过异步消息在网络上相互通信。节点不维护有关其他节点的会话信息(这是设计限制)。
假设您要确保只有您的节点才能读取正在发送的消息。我相信加密就是解决问题的方法。
由于节点没有维护会话,并且通信必须以无状态,无连接的方式工作,我猜测排除了非对称加密。
所以这就是我想做的事情:
我应该使用什么密码进行此加密?什么关键长度?
我更愿意使用ezPyCrypto支持的内容。
假设,正如大多数人指出的那样,我选择了AES。我应该使用什么模式?
我无法弄清楚如何使用ezPyCrypto,PyCrypto似乎挂在主持人交换和谷歌keyczar没有解释如何设置它 - 我担心,如果我不只是得到它,然后我冒着引入不安全的风险。所以准系统会更好。 This guy声称在python中有一个很好的AES模块,但他也声称这是他的第一个python项目 - 尽管他可能比我更聪明,也许他被绊倒了?
编辑:我将搜索python的实现移至another question以停止clobber ...
答案 0 :(得分:8)
我根本没有关于加密的线索。但我需要它。怎么样?
危险!如果您对密码学了解不多,请不要尝试自己实施。密码学难以正确。有许多不同的方法可以破解密码系统的安全性,而不是实际破解密钥(通常很难)。
如果您只是对流式数据采用密码,如果没有仔细的密钥管理和其他对加密系统细微之处的理解,您可能会遇到各种漏洞。例如,如果没有针对节点之间密钥分配的特定计划,您描述的方案将容易受到man-in-the-middle attacks的攻击,并且可能容易受到chosen-plaintext和/或known-plaintext attacks的攻击,具体取决于您的分发方式系统与外部世界进行通信,并确切选择密码和mode of operation。
所以......在你可以安全地使用它之前,你必须先阅读加密文件。
答案 1 :(得分:7)
您的第一个想法应该是渠道安全 - SSL / TLS或IPSec 不可否认,这两者都有一定的设置开销,IPSec比SSL / TLS更多,特别是在涉及PKI等时 - 但它在开发,可靠性,安全性等方面不仅仅是自己付出的代价。请确保您使用的是强密码套件,以适应协议。
如果SSL / TLS或IPSec都不适合您的方案/环境,您的下一个选择应该是AES(又名Rijndael)。
使用至少256位长的键,如果你想要你可以更长
密钥应该由加密安全的随机数生成器(而不是简单的rnd()调用)随机生成
将密码模式设置为CBC
使用PKCS7填充。
生成一个独特的加密随机初始化向量(IV)。
不要忘记妥善保护和管理密钥,也可以考虑定期进行密钥轮换。
根据您的数据,您可能还希望实现密钥散列,以提供消息完整性 - 使用SHA-256进行散列。
在极少数情况下,您可能希望使用流密码,但这通常会更复杂,我建议您在第一次使用时避免使用它。
现在,我不熟悉ezpycrypto(或者通常是python),并且不能说它支持所有这些;但是这里的一切都是非常标准和建议的最佳实践,如果你的加密库不支持它,我建议你找一个; - )。
答案 2 :(得分:4)
假设使用对称加密,那么AES应该是您的默认选择,除非您有充分的理由选择其他方式。
选择AES时,参与的竞争很激烈,获胜者都是经过精心挑选的。甚至加密神布鲁斯施奈尔也说过,AES竞赛者比他提交给比赛的算法(TwoFish)更好。
答案 3 :(得分:3)
AES 256通常是首选,但根据您所在的位置(或您客户的位置),您可能会受到法律限制,并且会被迫使用较弱的东西。
另请注意,您应该为每个通信使用随机IV并将其与消息一起传递(这也将节省对时间戳的需要)。
如果可能,请尽量不依赖算法,并将算法与消息一起传递。然后,节点将查看标头,并决定将用于解密的算法。这样,您可以在某个部署调用算法时轻松切换算法。
答案 4 :(得分:1)
我可能会选择AES。
答案 5 :(得分:1)
非对称加密也适用于此场景。只需让每个节点发布它的公钥即可。任何想要与该节点通信的节点只需要使用该节点的公钥加密消息。使用非对称密钥的一个优点是更改和分发密钥变得更容易 - 因为公钥可以公开分发,每个节点只需要更新它的公钥 - 私钥对并重新发布。您不需要整个网络(或每个节点对)的某些协议来同意新的对称密钥。
答案 6 :(得分:1)
为什么不在必须安全通信的节点之间创建VPN?
然后,您不必费心编写自己的安全解决方案,并且您不仅限于静态共享密钥(如果受到破坏,将允许所有捕获的流量在事后解密)。