从密码生成密钥对

时间:2018-03-27 10:29:43

标签: java security encryption

我想使用基于密码的私钥的非对称加密。要求是提供的安全级别必须与(1)使用基于密码的对称加密,(2)在常规"中使用非对称加密相同。方式。

我将不得不在Java中使用它,但答案可能是通用的。

我知道我可以生成密钥对并使用基于密码的对称密钥加密privateKey,但是,这样我将需要一个服务器(或其他存储)来存储这个加密密钥。我想避免这种情况。如果我可以从密码生成密钥对,则不需要密码对。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

如果您仅使用密码设置私钥,则密码只会与密码一样强,即能猜出密码的人都可以获得私钥。

这类似于生成私钥/公钥对,使用对称密码加密私钥然后将它们一起发布。

这当然会使整个系统变弱,因为您不再需要拥有秘密令牌,只需要知道密码。

答案 1 :(得分:2)

每当我看到这个问题或其中的一个变体时,它通常都是糟糕的设计决策的结果。几乎总是,正确答案是生成随机RSA密钥对并使用标准的基于密码的加密(如PBKDF2或argon2)保护私钥。我只看到过一个用例,这个用例至少有点意义,那是当天的加密令牌,绝对没有非易失性存储。你不会找到它,因为没有理由建立这样的令牌,非易失性存储在2018年并不具有异国情调。

通常,您可以这样做:java' s RSA key generation code接受SecureRandom的实例,Oracle提供程序使用该实例生成RSA的候选素数。您可以将SecureRandom(我认为)子类化,以提供一个使用密码来生成确定性,可重复的随机数序列的类,这样每次调用KeyPairGenerator. generateKeyPair()时都会生成相同的密钥对(包括私钥)。 bouncycastle库包含一个可用作模型的示例FixedSecureRandom。请注意,确定性RNG仍然必须是加密安全的,除了它没有足够的熵。 FixedSecureRandom不安全,它只是直接返回预先提供的字节作为输出。也许您可以将FixedSecureRandomorg.bouncycastle.crypto.prng包中的其他CSPRNG合并。