类似于"Making RSA keys from a password in python "问题,我想使用给定的密码重复创建同一对RSA密钥。
上面提到的问题将以下代码作为答案:
$password = "swordfish";
$salt = "yourAppName";
$master_key = hash_pbkdf2("sha256", $password, $salt, 10, 256);
$counter = 0;
function my_rand($n) {
$counter++;
return hash_pbkdf2("sha256", $master_key, "my_rand:" . $counter, 10, 256);
}
$RSA_key = openssl_pkey_new(???);
我试图像这样在PHP中复制此代码:
openssl_pkey_new
但是我现在不知道如何使用自定义随机函数来复制RSA密钥生成器,因为PHP phpseclib
函数和int& n = s1.get();
n = 10;
std::cout << s1.get();
都没有添加自定义随机函数的选项。
我该怎么做才能从给定的密码重复生成相同的RSA密钥对?
答案 0 :(得分:1)
TL; DR:您不应从给定的密码生成RSA密钥对
似乎已经考虑到了OpenSSL和phpseclib的创建。这不足为奇,因为against the solution itself还有很多要说的。此外,还有许多实施问题,especially for RSA。
如果您仍然会继续实施这种不明智的方案,那么您应该为密钥生成查找PHP实现,然后将其存储在解决方案中。这样做的原因是,否则,随机数生成,素数查找或RSA密钥生成方法可能会在内部发生变化(在升级库时)并产生不同的密钥对。我不会在Java上使用此解决方案,即使它确实允许您插入自己的RNG以允许生成确定性密钥对,这是您所使用的技术术语。试图做。
还有其他使用户保持其私钥安全的方法,例如密钥的基于密码的加密。这需要存储加密的密钥,但是至少是通常的做法,失败的原因要少得多。
如果要加密任意大小的消息,则需要某种混合加密-就像您必须使用任何其他种类的RSA密钥对一样。
请注意,椭圆曲线加密的情况要好一些。您可以将PBKDF2与SHA-256组合在一起以创建私钥,然后通过将基点G与该私钥值进行点乘法来导出公钥。这不太可能失败。您可以使用ECIES使用椭圆曲线进行加密,因为EC无法直接加密消息或密钥。
但是,仍然存在一个问题,即您永远无法更改密码,并且必须使用恒盐来始终生成相同的私钥和公钥。因此,我仍然不推荐该方案,因为它允许脱机的多目标攻击使用公钥值或密文来查找密码。
为确保找不到密码,它必须确实强-如此强以至于您可能必须将其存储在某个地方。