Java 加密函数每次返回不同的输出

Java 加密函数每次返回不同的输出,java,encryption,cryptography,jasypt,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.encryp

我有以下代码-

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

第二次运行-
z3ydxfpubgaqmpr+5MAKR5P09mAJ7Wd

第三次运行-
kvgiccexzdfjnv/n0lxyFN5WW7dWMT7

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


这是怎么回事?

可能是使用了随机IVs或随机填充。这对于某些攻击下的安全性来说非常重要,但它会导致同一消息的密文不同。

从该方法的文档中复制

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

此加密程序在每次加密操作中使用salt。盐的大小取决于所使用的算法。此salt用于创建加密密钥,如果由随机生成器生成,还将在结果开头添加未加密的salt,以便可以执行解密操作

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


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

我不确定此库的开发人员是否了解加密技术。密码不可靠。密钥不能从初始化向量派生。另外,彩虹表攻击只适用于哈希函数,而不适用于密码。@ntoskml我假设他们在PBKDF之前在密码中添加了salt。。。如果他们说他们遵循PKCS#5标准,我假设他们也在使用随机静脉注射。我知道彩虹表只适用于散列。。。但是在PBKDF的情况下,我想您可以预先计算密码->派生密钥的彩虹表(假设函数使用静态IV)。更正我之前的陈述:在阅读RFC2898文档时,我发现salt是在KDF本身中使用的,而不是在它之前。KDF(我假设为PBKDF2)通常在内部使用哈希函数(通常是HMAC-SHA1)来生成派生密钥。攻击者可以利用rainbow表在蛮力攻击中计算哈希,从而大大加快KDF的速度。还没有提到生成密码->派生密钥表。该库的作者似乎为每次加密生成一个新的派生密钥,因此声明使用了随机salt。这种随机性实际上对安全性非常重要。否则,大量关于明文的信息就会泄露出去。