使用PHP中的密码制作RSA密钥

时间:2019-05-13 18:03:46

标签: php encryption rsa

类似于"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密钥对?

1 个答案:

答案 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无法直接加密消息密钥。


但是,仍然存在一个问题,即您永远无法更改密码,并且必须使用恒盐来始终生成相同的私钥和公钥。因此,我仍然不推荐该方案,因为它允许脱机的多目标攻击使用公钥值或密文来查找密码。

为确保找不到密码,它必须确实强-如此强以至于您可能必须将其存储在某个地方。