我想使用NaCl加密库(或TweetNaCl),但是我非常希望对我的应用程序具有完美的前向保密性。

据我所知,所有Bob都需要解密一条消息。来自Alice的NaCl的crypto_box_open是Alice的公钥及其私钥。因此,如果一个窃听的对手存储了所有消息并随后获得了Bob的私钥的访问权限,他可以解密所有以前存储的通信。


我在这件事上是否正确?最好的方法来解决这个问题? (最好仅使用在NaCl中实现的算法)


#1 楼

是的,您是正确的。

不走NaCl的最简单方法是创建一个临时的随机crypto_box_keypair,然后使用其长期密钥交换公共密钥。在该会话期间,进一步的通信将使用新的密钥对作为crypto_box。完成会话后,请从内存中删除这些临时密钥。

私钥仅用于该会话,因此后来攻陷了其中一台计算机的攻击者将无法解密其中的任何一个。使用这些密钥加密的邮件,并且只能从存储的通信中找到其公共密钥。