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