首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不使用salt从密码生成密钥

不使用salt从密码生成密钥
EN

Stack Overflow用户
提问于 2022-10-10 14:29:24
回答 1查看 208关注 0票数 1

Java有一个方便的类PBEKeySpec,它允许您使用迭代计数、密钥长度和salt值从密码中生成一个密钥,用于解密目的。参见下面的示例。

代码语言:javascript
复制
private static Key getPasswordBasedKey(String cipher, int keySize, char[] password) throws NoSuchAlgorithmException, InvalidKeySpecException {
    byte[] salt = new byte[100];
    SecureRandom random = new SecureRandom();
    random.nextBytes(salt);
    PBEKeySpec pbeKeySpec = new PBEKeySpec(password, salt, 1000, keySize);
    SecretKey pbeKey = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256").generateSecret(pbeKeySpec);
    return new SecretKeySpec(pbeKey.getEncoded(), cipher);
}

但是,如果salt不是特定加密案例的一部分,该怎么办?然后,为了得到正确的输出,我也必须解密没有盐。但在本例中,PBEKeySpec(char[] password, byte[] salt, int iterationCount, int keyLength)的构造函数将抛出一个异常(如果salt为null,则为NullPointerException;如果为空数组,则为IllegalArgumentException )。因此,我的问题是:在Java中是否有任何方法可以从密码中生成密钥,同时考虑到iterationCount和keyLength,但跳过了盐类?

为什么我需要它:

  • 数据是这样加密的(没有盐)在另一端。我不能改变它。
  • 因此,现在我需要一个Java工具,它可以让我在不需要有salt的情况下解密它(但仍然使用迭代计数和密钥长度)。
  • 我找不到这样的工具。
EN

回答 1

Stack Overflow用户

发布于 2022-10-11 10:04:15

要使用PBEKeySpec类获得相同的密钥,您需要相同的密码、salt和迭代计数(以及密钥大小)。您不能跳过salt部分,并期望获得相同的基于密码的密钥,因为只有这些提供的数据才能生成密钥,这是2^(salt-length)可能的方法。

对于基于密码的密钥生成,salt不需要是私有的。请参阅答案基于密码的Java 256位AES加密中的引文

共享password (a char[])和salt (由SecureRandom选择的byte[]-8字节)与接收者共享不需要保密的。

答案还解释了迭代和键大小是固定的或已知的。

也可以检查RFC2898 PKCS #5:基于密码的密码规范2.0版-第5页

在PKCS #5 v1.5中,Salt和迭代计数构成了基于密码的加密的基础,并且在这里也适用于各种密码操作。因此,这里定义的基于密码的密钥派生是密码、salt和迭代计数的函数,其中后两个量不需要保密。

强调“.,,其中后两个量不需要保密”(即salt和迭代)。

回答你的问题:

考虑到iterationCount和keyLength但跳过盐分,是否有任何方法从密码中生成(相同的)1-1密钥?

(由我增补)

答案是:不。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74016495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档