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

Posted

技术标签:

【中文标题】在 PHP 可读的 javascript 中创建 PEM 密钥对【英文标题】:Create PEM keypair in javascript readable by PHP 【发布时间】:2016-04-25 01:11:51 【问题描述】:

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

我查看了 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"));

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

【问题讨论】:

要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题对于 Stack Overflow 来说是无关紧要的,因为它们往往会吸引固执己见的答案和垃圾邮件。相反,请描述问题以及迄今为止为解决该问题所做的工作。 这可能不是一个常见的要求,因为它似乎试图复制 SSL/TLS 已经做的事情 嗯,当 server 创建密钥时,这真的很常见。在我的情况下,客户端应该创建密钥并将公共密钥提供给服务器,所以我们没有客户端的秘密 - 我们可以验证他的消息。这在现实生活中也很常见,但麻烦的是我们必须通过js在浏览器中制作密钥。 【参考方案1】:

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,但如果是这样,我不知道。

【讨论】:

以上是关于在 PHP 可读的 javascript 中创建 PEM 密钥对的主要内容,如果未能解决你的问题,请参考以下文章

PHP 在PHP中创建易读的密码

如何将 Python tkinter canvas postscript 文件转换为 PIL 可读的图像文件?

将时间戳转换为可读的日期/时间 PHP

dart 可以生成可读的 javascript 库吗?

javascript 人类可读的字节数

JavaScript 人类可读的毫秒时间戳