簡體   English   中英

如何使用密碼短語正確加密JS生成的RSA私鑰?

[英]How to properly encrypt a JS generated RSA private key with a passphrase?

我有一個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);

也許你可以調整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-----';
}

src: https//raw.githubusercontent.com/phpseclib/phpseclib/master/phpseclib/Crypt/RSA.php

如何使用密碼加密JS生成的RSA私鑰?

你有兩種選擇之一。 首先,加密到達磁盤的整個密鑰。 然后在使用之前解密它。 在這種情況下,您將密鑰視為要加密的文件。

其次,使用PKCS#8,又名RFC 5208,公鑰加密標准(PKCS)#8:私鑰信息語法規范版本1.2 特別是,請參閱RFC 5208的第6節, EncryptedPrivateKeyInfo

你有第三種選擇,但不建議。 第三種選擇是使用加密的PEM編碼。 它不可取,因為它已被PKCS#8取代。

將來,您將有第四個選項,即使用WebCrypto存儲密鑰。 在這種情況下,您將安全存儲的問題轉移到了平台。

不幸的是,我不知道你正在使用的圖書館,所以我不知道它可能會提供什么(或者可能不會提供)。 但上面的答案涵蓋了你問題的OpenSSL位。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM