Создание ключей RSA из пароля в PHP - PullRequest
0 голосов
/ 13 мая 2019

Аналогично вопросу в "Создание ключей RSA из пароля в 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 из заданного пароля?

1 Ответ

1 голос
/ 14 мая 2019

TL; DR: вы не должны генерировать пару ключей RSA из заданного пароля


Похоже, что OpenSSL и phpseclib были созданы с учетом этого.Это неудивительно, поскольку о самом решении можно многое сказать.Кроме того, существует много проблем с реализацией, , особенно для RSA .


. Если вы все еще хотите реализовать эту необдуманную схему, то вам следует поискать реализацию PHP длягенерация ключа и затем сохраните его вместе с решением .Причина этого заключается в том, что в противном случае генерация случайных чисел, поиск простых чисел или метод генерации ключей RSA могут измениться внутренне (при обновлении библиотеки) и создать другую пару ключей.Я бы не использовал это решение на Java, даже если оно делает , позволяя вам вставить свой собственный ГСЧ, чтобы разрешить генерацию пары детерминированных ключей , что является техническим термином того, что вы пытаетесьdo.

Существуют и другие способы обеспечения безопасности своего личного ключа, например, шифрование на основе пароля ключа.Это требует хранения зашифрованного ключа, но, по крайней мере, это обычная практика и у нее гораздо меньше причин для отказа.

Вам понадобится какая-то гибридная криптография, если вы хотите зашифровать сообщения произвольного размера - так же, как вына самом деле, пришлось бы иметь дело с любой другой парой ключей RSA.


Обратите внимание, что ситуация немного хуже для криптографии с эллиптической кривой.Вы можете объединить PBKDF2 с SHA-256 для создания закрытого ключа, а затем получить открытый ключ, выполнив умножение точки базовой точки G на значение этого закрытого ключа.Это гораздо меньше шансов на провал.Вы можете использовать ECIES для шифрования с помощью эллиптических кривых, поскольку EC не может напрямую зашифровать сообщения или ключами.


Однако у вас все еще будет проблемаНикогда не можете изменить пароль, и что вы должны использовать постоянную соль, чтобы всегда генерировать один и тот же закрытый ключ и открытый ключ.Из-за этого я все равно не рекомендую эту схему, поскольку она позволяет автономным, многоцелевым атакам найти пароль с использованием значения открытого ключа или зашифрованного текста.

Чтобы быть уверенным, что пароль не может быть найденоно должно быть действительно сильным - настолько сильным, что вам, вероятно, придется его где-то хранить.

...