在PHP可读的javascript中创建PEM密钥对

时间:2016-01-19 14:06:10

标签: javascript php cryptography rsa jwt

Usecase:客户端在浏览器中创建RSA密钥对,将pubkey发送到服务器,然后使用保存在本地存储中的密钥签名他的消息。

我已经查看了JWT,但它没有在浏览器中生成密钥对(或者我无法找到它)。我找到了一个创建密钥(https://github.com/juliangruber/keypair)的库,但是我从openssl_pkey_get_public函数中获得了PHP中无法读取的pub键。

我真的卡住了 - 我认为它应该是相当普遍的但是经过一整天的谷歌搜索我无法理解一件事。很多标准,格式......

任何人都可以建议一个库或方法,我可以在JS中使用cient创建密钥并使用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"));

它失败了。我想格式不是预期的格式?

1 个答案:

答案 0 :(得分:0)

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);

也许还有其他非CLI解决方案可以将PKCS1密钥转换为PKCS8,但如果是这样,我就不知道它。