我有以下代码 -
import org.jasypt.util.text.BasicTextEncryptor;
public static void main(String[] args) {
BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
textEncryptor.setPassword("kshitiz");
String cipherText = textEncryptor.encrypt("my_secret");
System.out.println(cipherText);
}
每次运行它时输出都不同 -
第一次运行 - 7vZzcsVFortOUf4yLyQ9xSEUM2pKSXAs
第二轮 - Z3YDxfPpubGAQMpr+5MAKR5P09mAJ7Wd
第3次运行 - kVGIGcCEXZDFJnV/n0lxyFN5WW7dWMT7
所有输出都是正确的,因为解密它们会给我my_secret
。
这是怎么回事?
答案 0 :(得分:4)
从方法文档复制。
PKCS#5:基于密码的密码学标准中描述了用于执行加密操作的机制。
此加密器对每个加密操作使用salt。盐的大小取决于所使用的算法。此salt用于创建加密密钥,如果由随机生成器生成,它也会在结果开始时未加密地附加,以便可以执行解密操作。
如果使用随机盐生成器,则同一消息的两个加密结果将始终不同(除了随机盐重合的情况除外)。这可以通过一次对数据集进行蛮力攻击来强制执行安全性,并迫使攻击者对每个单独的加密数据执行暴力攻击。
基本上,为了符合标准,使用在运行时随机生成的加密盐并将其附加到输出字符串。这种盐使用预先计算的彩虹表来防止暴力攻击。
答案 1 :(得分:3)
它可能使用随机IV或随机填充。这对于某些攻击下的安全性实际上很重要,但它会导致同一消息的不同密文。