如何使用密码短语正确加密JS生成的RSA私钥?

时间:2015-03-11 12:17:39

标签: php encryption openssl private-key

我有一个以后自己生成RSA私钥/公钥对的php后端,用给定的密码加密私有部分。

现在我使用此库:http://travistidwell.com/jsencrypt/在客户端生成密钥对。但我没有找到如何使用此库使用密码加密私钥。所以我尝试使用它:http://www.movable-type.co.uk/scripts/aes.html但似乎我得到的密钥不起作用,我无法在我的php后端使用它进行加密/解密,并且不同的密钥管理应用程序不需要#&# 39;识别钥匙。

我做错了什么以及如何使用密码短语成功加密原始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);

2 个答案:

答案 0 :(得分:1)

也许你可以调整代码from 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

答案 1 :(得分:0)

  

如何使用密码加密JS生成的RSA私钥?

您有两种选择之一。首先,加密到达磁盘的整个密钥。然后在使用之前解密它。在这种情况下,您将密钥视为要加密的文件。

其次,使用PKCS#8,a.k.a。RFC 5208, Public-Key Cryptography Standards (PKCS) #8: Private-Key Information Syntax Specification Version 1.2。特别是,请参阅RFC 5208的第6部分, EncryptedPrivateKeyInfo

你有第三种选择,但不建议。第三种选择是使用加密的PEM编码。它不可取,因为它被PKCS#8取代。

将来,您将有第四个选项,即使用WebCrypto存储您的密钥。在这种情况下,您将安全存储问题转移到平台。

不幸的是,我不知道您正在使用的库,所以我不知道它可能会提供什么(或者可能不会提供)。但上面的答案涵盖了你问题的OpenSSL位。