2013-03-14 33 views
3

我嘗試做以下PHP函數如何在Node.js的

openssl_private_encrypt 

用我的私鑰簽名的字符串

下面是等效的簽署W /私鑰我在做

var signer = crypto.createSign('RSA-SHA256').update(timestamp + '|' + userId); 
var signature = signer.sign(privKey, 'base64'); 

我的第一個問題是什麼意思,當RSA和SHA256放在一起?我明白使用RSA私鑰加密某些內容或使用SHA256散列某些內容意味着什麼。但我無法理解將這兩者結合在一起意味着什麼。

我把它放在那裏,因爲createSign需要一個字符串參數,(「RSA」不支持),以及RSA-SHA256是我發現的最接近的事。

我的第二個問題是,我該怎麼辦

openssl_private_encrypt 
在Node.js的

回答

2

普通簽名操作由一個散列計算,然後將其(如果需要的功能),然後通過專用密鑰加密的。散列是消息的壓縮 - 較小的表示,對此沒有找到重複的散列(衝突)。對於RSA,使用PKCS#1 v2.1(公共標準)中的方案填充消息,之後執行模冪運算。

的模取冪常常錯誤地稱爲加密,加密要求RSA不同的填補方法(並且不用於加密或者進行散列)。

你不應該使用openssl_private_encrypt簽署一個字符串,它是一個過時的功能,主要是要求比較特殊身份驗證。當它自己使用時,它使用用於簽名的填充來加密數據,但是它確實省去了散列和散列指示符。

要爲openssl_private_encrypt你需要能夠執行PKCS#1 v1.5的填充方法和模冪等價物。您可能可以從Node.js的源代碼中檢索這些函數,您不太可能在更高級別的API中找到它們。但是,建議您廢除PHP中的openssl_private_encrypt函數,並使用更高級別的簽名函數。

+0

嗨,非常感謝你的解釋。事情現在更加清晰。但我實際上正在開展跨公司協作項目。他們的文檔只在PHP中提供了「openssl_private_encrypt」示例。我別無選擇,只能走這條路。 – Max 2013-03-15 01:27:58

+0

您是否知道在簽名之前「openssl_private_encrypt」是否執行了散列計算?如果是,哪個散列算法?非常感謝你! – Max 2013-03-15 01:28:33

+0

不,它只是執行PKCS#1填充。見例如在這裏,http://www.sitepoint.com/forums/showthread.php?610882-OpenSSL-Private-Key-Encryption。請注意PKCS#1對1.5簽名方案使用了11個字節的填充開銷(沒有hash *結構*,就是這樣)。所以用戶可能使用128字節(1024位)的密鑰大小。 – 2013-03-15 10:06:14