我有一个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-----';
}
来源:https://raw.githubusercontent.com/phpseclib/phpseclib/master/phpseclib/Crypt/RSA.php
如何使用密码对JS生成的RSA私钥进行加密?
您有两种选择之一。首先,加密到达磁盘的整个密钥。然后在使用它之前对其进行解密。在这种情况下,您可以将密钥视为要加密的文件。
其次,使用 PKCS #8,又名 RFC 5208,公钥加密标准 (PKCS) #8:私钥信息语法规范版本 1.2。特别是,请参阅 RFC 5208 的第 6 节,加密私钥信息。
您有第三种选择,但不建议这样做。第三个选项是使用加密的 PEM 编码。这是不可取的,因为它已被PKCS #8取代。
将来,您将有第四种选择,那就是使用WebCrypto来存储您的密钥。在本例中,您将安全存储问题移至平台。
不幸的是,我不知道您正在使用的库,所以我不知道它可能(或可能不会)提供什么。但是上面的答案涵盖了您问题的OpenSSL部分。