gpt4 book ai didi

java - 如何根据密码在 Java 中创建 key 对?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:18:28 25 4
gpt4 key购买 nike

我想让爱丽丝创建一对公钥/私钥,以便鲍勃可以发送她的 secret 消息。然而,我希望爱丽丝能够从任何地方检查她的消息,而她必须随身携带一个包含她的私钥的内存棒会很痛苦。有没有什么方法可以让爱丽丝根据她记得的密码创建一个公钥/私钥对?通过这种方式,她可以随时生成私钥(和公钥)。

这个问题的简短版本是:我在哪里可以找到 cryptico.js 的 Java 等价物? .

此外,here's the same question在 Stack Overflow 上,但对于 javascript。

编辑:这是我对解决方案的第一次尝试:

    SecureRandom saltRand = new SecureRandom(new byte[] { 1, 2, 3, 4 });
byte[] salt = new byte[16];
saltRand.nextBytes(salt);

int keyLength = 3248;
SecretKeyFactory factory = SecretKeyFactory
.getInstance("PBKDF2WithHmacSHA1");
KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 8192, keyLength);
SecretKey key = factory.generateSecret(spec);

SecureRandom keyGenRand = SecureRandom.getInstance("SHA1PRNG");
keyGenRand.setSeed(key.getEncoded());

KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA");
gen.initialize(keyLength, keyGenRand);
java.security.KeyPair p = gen.generateKeyPair();

最佳答案

在讨论 RSA 时:您可以使用 PBKDF2 的结果来为伪随机数生成器播种,而后者又可用于生成 key 对。请注意,使用 SecureRandom 将不起作用,因为它会将种子添加到池中,而不是完全重新初始化 rng。 RSA 需要 PRNG 来找到随机素数。

如果您可以使用椭圆曲线密码术,您会过得更好。您可以在 F(p) 上选择标准 NIST 或 Brainpool 曲线。然后你可以使用 PBKDF2 的 32 字节输出作为私钥并计算公钥。 ECC 只需要一个随机私钥,并且由于 PBKDF2 的输出应该与随机无法区分,所以输出会很好。您不仅不需要额外的 PRNG,而且还为自己节省了计算 RSA key 对的时间 - 这可能很重要。

请注意,没有什么能阻止对使用上述计算出的 key 加密的内容进行暴力攻击,因此您最好要求提供 16 个或更多字符的密码,包含非字典单词、数字和符号。任何不足都可能会失败,尤其是在用户没有意识到可能的攻击的情况下。请注意,如果您没有存储空间,则不能使用随机盐。如果你没有随机盐,你就无法抵御彩虹表(对于你的特定应用程序,你当然可以使用特定应用程序的盐)。此外,具有相同密码的人将生成相同的私钥

当然,默认方式(例如在 PGP 中)是存储使用基于密码的加密方法加密的私钥。然而,这需要存储。这种方法的优点是您可以拥有一个完全随机的 key ,这意味着如果无法访问 key 存储,就不可能对密文进行暴力攻击。它增加了一个重要的额外层。

关于java - 如何根据密码在 Java 中创建 key 对?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11600509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com