我目前正在寻找一个使用Java的AES加密和解密示例,我偶然发现了这样的解决方案:
链接
其他解决方案也提供了同样的方法。我设法使它发挥了作用,但我对它的实施有一些疑问。
问题:
-
为什么PBEKeySpec类需要密码?它是干什么的?那里已经是一个密钥,为什么它需要一个额外的令牌或暗语
-
我知道密钥和salt是的加密值的一部分原始的未加密字符串。为什么会这样?为什么不允许将生成密钥和salt存储在其他地方?
谢谢,我非常感谢任何形式的帮助。只是想了解为什么会这样。
对于易于使用且坚如磐石的java加密库,我建议使用http://www.jasypt.org/
回答您的问题:
-
密码通常用于导出加密密钥;这是必要的,因为许多算法需要密钥满足某些特性,如长度和随机性,而人们通常使用的许多密码都不能满足这些特性。另请参阅https://docs.oracle.com/javase/7/docs/api/javax/crypto/spec/PBEKeySpec.html
-
salt和初始化向量存储在加密值的旁边(也就是说,它们没有加密(,因为这很方便-您可以轻松地检索它们并使用它们来解密原始字符串。这仍然是安全的,因为您通常只需要这些值是唯一的,而不需要保密;例如,盐可以为每个值提供唯一的盐,从而帮助您防止彩虹桌攻击。解释某些术语的有用资源:https://crypto.stackexchange.com/questions/3965/what-is-the-main-difference-between-a-key-an-iv-and-a-nonce