加密功能每次都返回不同的输出

时间:2013-08-08 04:46:27

标签: java encryption cryptography jasypt

我有以下代码 -

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

这是怎么回事?

2 个答案:

答案 0 :(得分:4)

从方法文档复制。

  

PKCS#5:基于密码的密码学标准中描述了用于执行加密操作的机制。

     

此加密器对每个加密操作使用salt。盐的大小取决于所使用的算法。此salt用于创建加密密钥,如果由随机生成器生成,它也会在结果开始时未加密地附加,以便可以执行解密操作。

     

如果使用随机盐生成器,则同一消息的两个加密结果将始终不同(除了随机盐重合的情况除外)。这可以通过一次对数据集进行蛮力攻击来强制执行安全性,并迫使攻击者对每个单独的加密数据执行暴力攻击。

基本上,为了符合标准,使用在运行时随机生成的加密盐并将其附加到输出字符串。这种盐使用预先计算的彩虹表来防止暴力攻击。

答案 1 :(得分:3)

它可能使用随机IV或随机填充。这对于某些攻击下的安全性实际上很重要,但它会导致同一消息的不同密文。