背景故事: 我正在尝试编写自己的日志记录库。这是出于爱好目的。对我来说,有一个必须要做的事情:记录的数据必须不对称加密。日志消息始终直接写入文件中,不进行缓存,不等待任何队列。
这意味着我将必须加密一小堆消息。即使瓶颈可能是缺少缓存和IO操作,我还是要明智地选择加密算法。
摘要:
您建议使用哪种算法?
答案 0 :(得分:1)
您似乎在解释“日志数据必须非对称加密”,这实际上是一种低级别的要求。 “记录的数据必须非对称加密”不是安全要求,而是一种实现方法。这是一种糟糕的实现方法,因为它要求您设计自己的加密协议(可以使用标准原语,但只能以非标准方式使用),并且会产生令人讨厌的局限性。
一个更合理的要求是“生成日志的机器一定不能解密它们”。这是一项安全要求:这是关于资产(日志)的安全性(特别是其机密性)的要求。
实现此安全要求的方法确实是使用非对称加密。但是,您不必采用非对称加密原语并将日志作为输入传递给它。相反,您使用hybrid encryption:生成一个对称密钥,使用该密钥加密日志,使用该非对称密钥加密该对称密钥,然后删除该对称密钥。
执行此操作的最佳方法是使用性能良好的库。 crypto_box
或crypto_box_easy
的crypto_box_seal
,NaCl和libsodium函数是此处的黄金标准。您传递用于加密的公共密钥,要签名的消息,然后得到一个加密的“盒子”,该盒子只能用私钥解密。 crypto_box_easy
和crypto_box
还将自己的私钥作为参数来签署日志,这在玩具示例中可能并不需要,但是在现实世界中通常很重要。 crypto_box_easy
和crypto_box
也采用随机数作为参数;该值可以是任何可以公开但不能重复使用的值,例如crypto_box_NONCEBYTES
字节的随机字符串。
例如,如果您不想使用crypto_box,因为您想学习如何在后台进行操作,则必须使用所选的低级密码库手动组装零件。根据您使用哪种非对称加密方式,流程有所不同。使用诸如ECIES之类的密钥建立方法:
使用诸如RSA-OAEP之类的密钥加密方法:
如果您确定可以使用相同的对称密钥对多个日志消息进行加密,则手动执行这些步骤可能会提高性能。这具有性能优势,因为非对称操作比对称操作慢。这样做没有长期的安全隐患。唯一的安全缺陷是短期缺陷:仍然可以解密当前对称密钥中的所有日志。例如,如果您确定破坏系统的攻击者可以读取最后一分钟的日志是可以的,那么您可以每分钟更新对称密钥。