2016-01-19 107 views
1

用例:客戶端在瀏覽器中創建RSA密鑰對,將pubkey發送到服務器,然後使用保存在本地存儲中的secretkey簽名他的消息。PHP中可創建PEM密鑰對

我已經看過JWT,但它沒有在瀏覽器中生成密鑰對(或者我找不到它)。我找到了一個創建密鑰的庫(https://github.com/juliangruber/keypair),但是我得到一個在openssl_pkey_get_public函數中無法在PHP中讀取的pub密鑰。

我真的被卡住了 - 我認爲它應該是相當普遍的,但經過一整天的搜索,我無法理解一件事。很多標準,格式...

任何人都可以建議一個圖書館或方法,我可以在cient創建密鑰在JS和驗證郵件,使用pubkey在PHP

這是我到目前爲止有: 我創建了一個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"));

它失敗。我想格式不是預期的格式?

+0

問題要求我們推薦或找到書籍,工具,軟件庫,教程或其他非本地資源,因爲它們傾向於吸引自以爲是的答案和垃圾郵件,所以不適合堆棧溢出。相反,請描述問題以及到目前爲止解決問題所做的工作。 – Epodax

+0

它可能不是那麼常見的一個需求,因爲它似乎試圖重複SSL/TLS已經做的事情 –

+0

嗯,當_server_創建密鑰時,這真的很常見。 在我的情況下,客戶端應該創建密鑰並向公衆提供服務器,所以我們沒有客戶端的祕密 - 我們可以驗證他的消息。它在現實生活中也很常見,但麻煩在於我們必須通過js在瀏覽器中創建密鑰。 –

回答

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但如果是這樣,我不知道這一點。