我正在编写一个需要以下安全功能的应用程序:启动CLI版本时,应该传递一些密钥。将生成一些未定义数量的相同大小的数据块。它需要远程存储。这将是一个敏感数据。我希望它只能通过最初传递给它的那一个密钥进行加密和访问。我的问题是,哪种算法适合我?我read about AES但它说
执行加密操作时,初始化加密器 使用此键,然后生成一个新的,唯一的初始化向量 你要加密的每条记录。
这意味着我必须传递一个密钥和一个IV,而不仅仅是密钥,这个IV对于每个生成的数据块应该是唯一的(并且会有很多这些)。
如果答案是AES, 加密模式是什么?
答案 0 :(得分:3)
您可以使用任何现代对称算法。数据量以及如何处理IV是无关紧要的,因为无论您选择哪种对称算法,它都适用。
AES-128是一个不错的选择,因为它不受美国法律的限制,128位对于暴力是不可行的。如果您不在美国,可以根据需要使用AES-256,但Java中的实现需要额外的安装。
你说你将生成许多数据块(或检索,无论如何)。
您可以在CBC模式下一次加密它们,这会将AES保持为分组密码,并且您最终只会得到一个IV。您在这里需要HMAC来保护完整性。然而,这不是最现代的方式。
您应在GCM模式下使用AES作为流密码。您仍然只有一个IV(nounce),但密文也将被验证。
应该随机生成IV并将其添加到密文之前。然后,您可以在解密时检索IV。请记住:IV不是秘密,它们只需要是随机的!
编辑:如下所述,应使用加密安全随机数生成器生成IV。基于CTR的模式(如GCM)的IV只需要是唯一的。
总之,你担心的不应该担心。一键很好。不止一个静脉注射也很好,但有一些方法可以做到这一点。你不得不担心IVs。不要使用ECB模式。