在 javascript 中创建可供 PHP 读取的 PEM 密钥对
Create PEM keypair in javascript readable by PHP
用例:客户端在浏览器中创建 RSA 密钥对,将公钥发送到服务器,然后使用保存在本地存储中的密钥对其消息进行签名。
我查看了 JWT,但它没有在浏览器中生成密钥对(或者我找不到)。我找到了一个创建密钥的库 (https://github.com/juliangruber/keypair),但我从 openssl_pkey_get_public
函数中得到了一个在 PHP 中不可读的 pub 密钥。
我真的被卡住了 - 我认为这应该很常见,但经过一整天的谷歌搜索后我什么都不懂。许多标准、格式...
任何人都可以建议一个库或方法,通过它我可以 在 JS 中创建密钥并验证消息,在 PHP 中使用 pubkey?
这是我目前的情况:
我使用上面提到的库在 JS 中创建了 pubkey
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAM3CosR73CBNcJsLv5E90NsFt6qN1uziQ484gbOoule8leXHFbyIzPQRozgEpSpi
whr6d2/c0CfZHEJ3m5tV0klxfjfM7oqjRMURnH/rmBjcETQ7qzIISZQ/iptJ3p7Gi78X5ZMh
LNtDkUFU9WaGdiEb+SnC39wjErmJSfmGb7i1AgMBAAE=
-----END RSA PUBLIC KEY-----
然后我将它保存到“/pubKey.pem”文件并尝试用PHP读取它:
openssl_pkey_get_public(file_get_contents("/pubKey.pem"));
它失败了。我想格式不是预期的格式?
openssl_pkey_get_public
要求密钥采用 PKCS8 格式。例如
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDNwqLEe9wgTXCbC7+RPdDbBbeq
jdbs4kOPOIGzqLpXvJXlxxW8iMz0EaM4BKUqYsIa+ndv3NAn2RxCd5ubVdJJcX43
zO6Ko0TFEZx/65gY3BE0O6syCEmUP4qbSd6exou/F+WTISzbQ5FBVPVmhnYhG/kp
wt/cIxK5iUn5hm+4tQIDAQAB
-----END PUBLIC KEY-----
我可以用 phpseclib 转换它:
<?php
include('Crypt/RSA.php');
$key = '-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAM3CosR73CBNcJsLv5E90NsFt6qN1uziQ484gbOoule8leXHFbyIzPQRozgEpSpi
whr6d2/c0CfZHEJ3m5tV0klxfjfM7oqjRMURnH/rmBjcETQ7qzIISZQ/iptJ3p7Gi78X5ZMh
LNtDkUFU9WaGdiEb+SnC39wjErmJSfmGb7i1AgMBAAE=
-----END RSA PUBLIC KEY-----';
$rsa = new Crypt_RSA();
$rsa->loadKey($key);
$rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_PKCS8);
$res = openssl_pkey_get_public("$rsa");
var_dump($res);
也许还有其他 non-CLI 将 PKCS1 密钥转换为 PKCS8 的解决方案,但如果是的话我不知道。
用例:客户端在浏览器中创建 RSA 密钥对,将公钥发送到服务器,然后使用保存在本地存储中的密钥对其消息进行签名。
我查看了 JWT,但它没有在浏览器中生成密钥对(或者我找不到)。我找到了一个创建密钥的库 (https://github.com/juliangruber/keypair),但我从 openssl_pkey_get_public
函数中得到了一个在 PHP 中不可读的 pub 密钥。
我真的被卡住了 - 我认为这应该很常见,但经过一整天的谷歌搜索后我什么都不懂。许多标准、格式...
任何人都可以建议一个库或方法,通过它我可以 在 JS 中创建密钥并验证消息,在 PHP 中使用 pubkey?
这是我目前的情况: 我使用上面提到的库在 JS 中创建了 pubkey
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAM3CosR73CBNcJsLv5E90NsFt6qN1uziQ484gbOoule8leXHFbyIzPQRozgEpSpi
whr6d2/c0CfZHEJ3m5tV0klxfjfM7oqjRMURnH/rmBjcETQ7qzIISZQ/iptJ3p7Gi78X5ZMh
LNtDkUFU9WaGdiEb+SnC39wjErmJSfmGb7i1AgMBAAE=
-----END RSA PUBLIC KEY-----
然后我将它保存到“/pubKey.pem”文件并尝试用PHP读取它:
openssl_pkey_get_public(file_get_contents("/pubKey.pem"));
它失败了。我想格式不是预期的格式?
openssl_pkey_get_public
要求密钥采用 PKCS8 格式。例如
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDNwqLEe9wgTXCbC7+RPdDbBbeq
jdbs4kOPOIGzqLpXvJXlxxW8iMz0EaM4BKUqYsIa+ndv3NAn2RxCd5ubVdJJcX43
zO6Ko0TFEZx/65gY3BE0O6syCEmUP4qbSd6exou/F+WTISzbQ5FBVPVmhnYhG/kp
wt/cIxK5iUn5hm+4tQIDAQAB
-----END PUBLIC KEY-----
我可以用 phpseclib 转换它:
<?php
include('Crypt/RSA.php');
$key = '-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAM3CosR73CBNcJsLv5E90NsFt6qN1uziQ484gbOoule8leXHFbyIzPQRozgEpSpi
whr6d2/c0CfZHEJ3m5tV0klxfjfM7oqjRMURnH/rmBjcETQ7qzIISZQ/iptJ3p7Gi78X5ZMh
LNtDkUFU9WaGdiEb+SnC39wjErmJSfmGb7i1AgMBAAE=
-----END RSA PUBLIC KEY-----';
$rsa = new Crypt_RSA();
$rsa->loadKey($key);
$rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_PKCS8);
$res = openssl_pkey_get_public("$rsa");
var_dump($res);
也许还有其他 non-CLI 将 PKCS1 密钥转换为 PKCS8 的解决方案,但如果是的话我不知道。