【发布时间】:2019-05-13 18:03:45
【问题描述】:
与"Making RSA keys from a password in python " 问题中的问题类似,我想使用给定密码重复创建同一对 RSA 密钥。
上面提到的问题有这个代码作为答案:
from Crypto.Protocol.KDF import PBKDF2
from Crypto.PublicKey import RSA
password = "swordfish" # for testing
salt = "yourAppName" # replace with random salt if you can store one
master_key = PBKDF2(password, salt, count=10000) # bigger count = better
def my_rand(n):
# kluge: use PBKDF2 with count=1 and incrementing salt as deterministic PRNG
my_rand.counter += 1
return PBKDF2(master_key, "my_rand:%d" % my_rand.counter, dkLen=n, count=1)
my_rand.counter = 0
RSA_key = RSA.generate(2048, randfunc=my_rand)
我试图像这样在 PHP 中复制这段代码:
$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(???);
但我现在不知道如何使用自定义随机函数复制 RSA 密钥生成器,因为 PHP openssl_pkey_new 函数和 phpseclib 都没有添加自定义随机函数的选项。
如何从给定的密码重复生成相同的 RSA 密钥对?
【问题讨论】:
-
根据密码生成密钥对的目的是什么?是出于学习目的还是出于好奇?我问这个问题是因为我真的对用例感兴趣。
-
我想这样做的目的是因为我想尝试使用 RSA 制作一个加密的聊天应用程序。此聊天应用程序应允许用户使用用户名 + 密码登录,因此需要从中生成密钥,但要以他们可以多次登录的方式。
-
但是生成密钥对的过程意味着你想要一个以前没有使用过的新密钥,这就是生成两个巨大的质数。如果您将非对称密钥用作共享对称密钥,那么它的目的是什么?您正在做的是使用共享密钥来计算加密密钥 - 您的想法很好,但您的执行存在缺陷。您遇到的称为 Diffie-Hellman 密钥交换,但您的过程很糟糕。我建议您在 Google 上搜索我提到的内容(Diffie-Hellman)并重新考虑您的流程。
-
重申您所追求的 - 从用户名和密码派生加密密钥绝对是错误的方法。如果您正在创建加密聊天应用程序,您应该通过 DH (Diffie-Hellman) 在双方之间协商一个加密密钥,然后双方创建密钥,而无需实际传输密钥。这样,您每次在参与者之间打开新连接时都可以创建新密钥。基于用户名或密码创建一个相同的非对称密钥是不安全的 - 密钥应该是不可猜测的,而在你的情况下 - 它们不是。
-
对不起,Mjh,但这在结构上没有有缺陷,即使它确实有大量的 usage issues 和 implementation issues。所以,是的,它不应该被使用,但出于你所说的其他原因。如果实施,我会改用椭圆曲线密码学,但这基本上用一罐含有成分的蠕虫代替了一罐蠕虫。
标签: php encryption rsa