簡體   English   中英

RSA-SHA1 簽名在 JavaScript 和 PHP 中不同

[英]RSA-SHA1 signature differs in JavaScript and PHP

我需要在 nodeJS 中創建一個RSA-SHA1簽名,我正在使用以下代碼

const crypto = require("crypto");
const sign = crypto.createSign('RSA-SHA1');
sign.update(data);
const result = sign.sign(privateKey, 'base64')
console.log(result);

我仔細檢查了我的代碼結果是否正確,如果我使用 select sha1WithRSA算法,我與在線工具的結果相同,當我使用openssl_sign ZC1C425268E68385D14ZCA944 時,我也會在 PHP

我需要為銀行 API 簽署數據,不幸的是他們不接受我的簽名並且他們沒有 NodeJS 實現

他們的文檔也是一團糟,這是他們文檔的C#實現

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(“<RSAKeyValue><Modulus>oQRshGhLf2Fh...”);
string data = "DATA";
byte[] signMain = rsa.SignData(Encoding.UTF8.GetBytes(data), new
SHA1CryptoServiceProvider());
sign = Convert.ToBase64String(signMain); 

有人可以幫我理解為什么我的簽名不等於C#實現(我不檢查 C# 的結果,但他們的服務器用 C# 編寫,他們不驗證我的簽名)

The following links to other official code fragments in PHP that together work with their server, but the result differs from standard openssl_sign function in PHP: index L211-L216 , RSAProcessor L45 , rsa.class L17-L22 , rsa.class L63-L82 .

  1. 他們的實現是非標准的 RSA-SHA1 嗎?
  2. 我的 NodeJS 代碼有什么問題,他們不接受它?

NodeJS 代碼和發布的 C# 代碼為相同的待簽名數據和相同的私鑰提供了相同的簽名。

從發布的鏈接可以看出,SHA1 散列數據已傳遞給RSA::rsa_sign ,但沒有任何地方添加 SHA1 摘要 ID。 與此一致的是,function 參數中也沒有指定摘要。

填充本身發生在RSA::add_PKCS1_padding中。 在這里,為了簽名,應用了 RSASSA-PKCS1-v1_5。 如前所述,處理傳遞的(已經散列的)數據,而不考慮摘要 ID。

因此,由 PHP 代碼創建的簽名不符合RSASSA-PKCS1-v1_5 ,而 NodeJS 代碼和 C# 代碼都遵循標准。

據我所知,在使用NodeJScrypto模塊的sign方法進行簽名時,必須始終指定摘要,並且始終隱式設置摘要 ID,因此無法復制 PHP 代碼的簽名。

允許設置摘要 ID 的替代方法是crypto.privateEncrypt 如果使用相同的數據和私鑰,以下代碼會生成 PHP 代碼或發布鏈接中描述的簽名過程的簽名:

var crypto = require('crypto')

var sha1 = crypto.createHash('sha1')
sha1.update(data)
var hash = sha1.digest()

var signature = crypto.privateEncrypt({key: privateKey, padding: crypto.constants.RSA_PKCS1_PADDING}, hash) 
console.log(signature.toString('base64'))

另一個問題是這個簽名是否可以被銀行 API 驗證。 畢竟API的文檔顯然包含了兩個不一致的實現,所以文檔看起來不是很靠譜。 此外,當然也可能存在其他缺陷,請參閱 fgrieu 的評論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM