6

我有以下代码 -

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

第三轮——kVGIGcCEXZDFJnV/n0lxyFN5WW7dWMT7

所有输出都是正确的,因为解密它们给了我my_secret

这是怎么回事?

4

2 回答 2

5

从方法的文档中复制。

PKCS #5: Password-Based Cryptography Standard 中描述了用于执行加密操作的机制。

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

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

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

于 2013-08-08T05:47:44.397 回答
3

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

于 2013-08-08T04:47:56.907 回答