Как правильно зашифровать сгенерированный JS закрытый ключ RSA с помощью ключевой фразы?

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

Сейчас я использую эту библиотеку: http://travistidwell.com/jsencrypt/ создать пару ключей на стороне клиента. Но я не нашел, как с помощью этой библиотеки зашифровать закрытый ключ парольной фразой. Поэтому я попытался использовать это: http://www.movable-type.co.uk/scripts/aes.html но кажется, что ключ, который я получаю, не работает, я не могу зашифровать / расшифровать его, используя мой php-сервер, и различные приложения для управления ключами не распознают ключ.

Что я делаю не так и как правильно зашифровать исходный закрытый ключ JSEncrypt с помощью ключевой фразы?

Вот как пара ключей была сгенерирована на PHP:

                $config = array(
"digest_alg" => "sha256",
"private_key_bits" => 2048,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
"encrypt_key" => true
);
$keypair = openssl_pkey_new($config);

$pkey_pass = '123';

openssl_pkey_export($keypair, $privKey, $pkey_pass, $config);
$fp = fopen($keys_folder . '/private.pem', 'w');
fwrite($fp, $privKey);
fclose($fp);

$pubKey = openssl_pkey_get_details($keypair);
$fp = fopen($keys_folder . '/public.pem', 'w');
fwrite($fp, $pubKey);
fclose($fp);

3

Решение

Может быть, вы могли бы адаптировать код от phpseclib. Цитирую это:

if (!empty($this->password) || is_string($this->password)) {
$iv = Random::string(8);
$symkey = pack('H*', md5($this->password . $iv)); // symkey is short for symmetric key
$symkey.= substr(pack('H*', md5($symkey . $this->password . $iv)), 0, 8);
$des = new TripleDES();
$des->setKey($symkey);
$des->setIV($iv);
$iv = strtoupper(bin2hex($iv));
$RSAPrivateKey = "-----BEGIN RSA PRIVATE KEY-----\r\n" .
"Proc-Type: 4,ENCRYPTED\r\n" .
"DEK-Info: DES-EDE3-CBC,$iv\r\n" .
"\r\n" .
chunk_split(base64_encode($des->encrypt($RSAPrivateKey)), 64) .
'-----END RSA PRIVATE KEY-----';
} else {
$RSAPrivateKey = "-----BEGIN RSA PRIVATE KEY-----\r\n" .
chunk_split(base64_encode($RSAPrivateKey), 64) .
'-----END RSA PRIVATE KEY-----';
}

ЦСИ: https://raw.githubusercontent.com/phpseclib/phpseclib/master/phpseclib/Crypt/RSA.php

1

Другие решения

Как зашифровать сгенерированный JS закрытый ключ RSA с помощью ключевой фразы?

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

Во-вторых, используйте PKCS # 8, a.k.a. RFC 5208, Стандарты криптографии с открытым ключом (PKCS) # 8: Спецификация синтаксиса информации закрытого ключа, версия 1.2. В частности, см. Раздел 6 RFC 5208, EncryptedPrivateKeyInfo.

У вас есть третий вариант, но это не рекомендуется. Третий вариант — использовать зашифрованную кодировку PEM. Его не рекомендуется, потому что он был заменен PKCS # 8.

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

К сожалению, я не знаю о библиотеке, которую вы используете, поэтому я не знаю, что она может (или не может предложить). Но ответы выше охватывают биты OpenSSL вашего вопроса.

0

По вопросам рекламы [email protected]