Sha1 从 xml 签署 Nodejs
Sha1 sign Nodejs from xml
我在 .net 中有一个方法,我想从 Nodejs 获得相同的输出。该代码负责使用私钥创建 Sha1 签名。这是我的 .net 代码:
private string GetSignature(string data)
{
RSACryptoServiceProvider csp = new RSACryptoServiceProvider(2048);
csp.FromXmlString(privateKey);
byte[] inputBytes = Encoding.UTF8.GetBytes(data);
byte[] signatureBytes = csp.SignData(inputBytes, "SHA1");
return Convert.ToBase64String(signatureBytes);
}
我的 nodejs 等效项是:
var sign = crypto.createSign('sha1');
sign.update(data);
sign.end();
var signed = sign.sign(pemKey,'base64');
但是,这两者的结果是不一样的。请帮我解决这个问题。
我写了两个程序,一个在 Node.js 中,另一个在 C# 中,以演示使用相同的密钥和相同的数据进行签名,在本例中为“hello world”。
两者的签名结果相同:
Node.js
NrBWcxfoUavH+6cG9rWRtfKKkMaiptrXvjeTlc9NG2ozu3YGBr17dphI3mZ24Khe6LsFQOpiJylg9i5eAxNR22yGDSRKM+SjsRe0pFVk58XdKCtQQs2IiNi12yPifA4AIBBPqCJSGLqTlRKx3urAkpkTAHCBTpMj2BJ95FuufIkzL90SdZYEz0QC8O9nNpatVYlmnCLdU/iAoc7D4gJIBBBzKxaCGL81tgOWf7pKKMPpkbWGH+6z1fNWnz4HDoIz+CfFwtInQP/nMhMvq5v5O3B/ndHrwYU6YwiewwOqYsvv/bMVXwOAWV5c22oFEPcdUgi6ehCwqcsRM5KtDgVf+g==
网络:
NrBWcxfoUavH+6cG9rWRtfKKkMaiptrXvjeTlc9NG2ozu3YGBr17dphI3mZ24Khe6LsFQOpiJylg9i5eAxNR22yGDSRKM+SjsRe0pFVk58XdKCtQQs2IiNi12yPifA4AIBBPqCJSGLqTlRKx3urAkpkTAHCBTpMj2BJ95FuufIkzL90SdZYEz0QC8O9nNpatVYlmnCLdU/iAoc7D4gJIBBBzKxaCGL81tgOWf7pKKMPpkbWGH+6z1fNWnz4HDoIz+CfFwtInQP/nMhMvq5v5O3B/ndHrwYU6YwiewwOqYsvv/bMVXwOAWV5c22oFEPcdUgi6ehCwqcsRM5KtDgVf+g==
希望对您有所帮助。在你的情况下,我想知道使用的键是否有任何不同,因为代码(两种语言)与你所拥有的非常相似。在任何情况下,如果您使这个示例正常运行,您也许就能理解您的代码中的失败点!
test-signature.js
function testSignature(data) {
const crypto = require('crypto');
const fs = require('fs');
const privateKey = fs.readFileSync('./private-key.pem', 'utf8');
const sign = crypto.createSign('SHA1');
sign.update(data);
sign.end();
const signature = sign.sign(privateKey);
console.log("Signature:", signature.toString('base64'));
}
testSignature("hello world");
private-key.pem
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAoTZ5Vl3o1pwH8pMNQNj47ff7WHJBjYQzGvMRstNjOWqQQnpW
VjvXkquRC1xfw8l09AQxk+E3CGPmzHDxdvJFWwMIvzH//xQjvOj1LJiDiDbvMf+V
QC4ntx4JgMAv5rW1DjkbpUJeRHjl9r/T17EGKtaf4srejkNRfTKxFMwWjPimCKS7
IOUIKbFYQXEgbMmL9Ow6CNnE/WVD3HahC4OjznkJdkRMrmVFDC8g7nWN0jipfaWO
RdzgNdKByn3kYpo3irSgkwE5isdbOWe1tXImjkZgGbpn2eL8sUNpFAPwR81yjQWP
uF1O/KO2Kstoc3nwpDo3L2ZGD0IWQNOJss3/mwIDAQABAoIBAC1GxVEyUsBjVgAU
uLYruc3rxZWTkUGTjV7WQXQ91jI78YQaI8FYUTUKJlRQfzzXiZc2zk3ABNrAZAOq
/MXxSPVEpuI7wq/7EgZuTt1VgCtzcj5Sj7JUxCazsuuMDmf3RIBYHaGOQDdu1Pc1
7OM4/ohter4RR+wgj/RflkhHAVZZ1PpD6wM+7dQ3AmAfbHJIwtad59wKZvxQuZ8m
jpYZoQR2+UEhsDkCtyAg+UcuQgqLdLzdskJmpiyKutHHct8Gclrdo9dfMpTIK7Cb
C83SFKKwbMPTUB+L/Slho2TQXxo4WLcvDNpFgpRlsAUw7UEwucGzr00HqYMiVyud
MEx3peECgYEAzMnEOiaol4T6jcOIYaGhQD8Z1ZjB1uDmmizyHYQM4s1gTZDBtbqk
ero20c1sKFeejQ5nBZGy8eN6vBNF1Stt73xkWeED5fXxHyUn6iN4SAT/++SO7Xfz
FLzSLfpEWAc4i0w6Pi/tReEn3tYAJ1l2cXP2P/Sc46R2Wk3phI3hbCkCgYEAyYcT
1hTUeQ5Z9Rd9XRqygLz14VZGkKLa4IrhUKSHmHIeBeqIKXuD0ELkSgIxr679CdIL
VcT6/uJPqJythYriRN3UHnUx5rvTaymaOP2Eq3s2bpuXTCqipftNTu2FysmdrjT5
qT/bpdRoVeoMAZDgRG7cjlJcsiExrebkZvtBRiMCgYB8f0T+HTZtNvijanXk9L/1
MOdhxUZCfeNzY1OlwfubfkPHo/M/qcIIomBlV78jH3FSS6kx54ukJikdYZIYsBhb
eYIAah1WlhgKWSpU209qaS++UQrbLwrmVoxoSzd1VJ55gNP/rl9PFjyI6gyZ33d0
LY1NAEbI1djluWv3m9GpUQKBgBAssz7fdR4yNK4jMICkf+ctQ17OmeNJ7t9Oxj6+
tdNadWZsKHmL3Ex+0evOuUYseUqsfRRpNuv2JgaWbKbnOrnkQ/4d0d9++70CHcqt
LlTFEt1Vx5LpaRyBSvcmwTJBdFJjFhardWmd3rHmkwgdJKLZcwJJQf9aAq6+dV5+
lAKZAoGABdwAX1oOqMruuPiqdRPaXoydw3uSwD63/ezafG/Sqyha9m356LyP9Ys3
pZQduJb8TLlpBtdO6YgoW+sDjnNhZHAL9O2mZF0ViN5Nqhmk2qNvlzLaAOr0/Gu2
Mw91BG6RVvEKOpp0We0p7zAuPV02tMiLmGaoUzG5XHcMtGrXWQ8=
-----END RSA PRIVATE KEY-----
Program.cs
using System;
using System.Security.Cryptography;
using System.Text;
public class Program
{
public static void Main()
{
testSignature();
}
static void testSignature()
{
Console.WriteLine(GetSignature("hello world"));
}
static String getPrivateKey()
{
return @"<RSAKeyValue>
<Modulus>oTZ5Vl3o1pwH8pMNQNj47ff7WHJBjYQzGvMRstNjOWqQQnpWVjvXkquRC1xfw8l09AQxk+E3CGPmzHDxdvJFWwMIvzH//xQjvOj1LJiDiDbvMf+VQC4ntx4JgMAv5rW1DjkbpUJeRHjl9r/T17EGKtaf4srejkNRfTKxFMwWjPimCKS7IOUIKbFYQXEgbMmL9Ow6CNnE/WVD3HahC4OjznkJdkRMrmVFDC8g7nWN0jipfaWORdzgNdKByn3kYpo3irSgkwE5isdbOWe1tXImjkZgGbpn2eL8sUNpFAPwR81yjQWPuF1O/KO2Kstoc3nwpDo3L2ZGD0IWQNOJss3/mw==</Modulus>
<Exponent>AQAB</Exponent>
<P>zMnEOiaol4T6jcOIYaGhQD8Z1ZjB1uDmmizyHYQM4s1gTZDBtbqkero20c1sKFeejQ5nBZGy8eN6vBNF1Stt73xkWeED5fXxHyUn6iN4SAT/++SO7XfzFLzSLfpEWAc4i0w6Pi/tReEn3tYAJ1l2cXP2P/Sc46R2Wk3phI3hbCk=</P>
<Q>yYcT1hTUeQ5Z9Rd9XRqygLz14VZGkKLa4IrhUKSHmHIeBeqIKXuD0ELkSgIxr679CdILVcT6/uJPqJythYriRN3UHnUx5rvTaymaOP2Eq3s2bpuXTCqipftNTu2FysmdrjT5qT/bpdRoVeoMAZDgRG7cjlJcsiExrebkZvtBRiM=</Q>
<DP>fH9E/h02bTb4o2p15PS/9TDnYcVGQn3jc2NTpcH7m35Dx6PzP6nCCKJgZVe/Ix9xUkupMeeLpCYpHWGSGLAYW3mCAGodVpYYClkqVNtPamkvvlEK2y8K5laMaEs3dVSeeYDT/65fTxY8iOoMmd93dC2NTQBGyNXY5blr95vRqVE=</DP>
<DQ>ECyzPt91HjI0riMwgKR/5y1DXs6Z40nu307GPr6101p1ZmwoeYvcTH7R6865Rix5Sqx9FGk26/YmBpZspuc6ueRD/h3R3377vQIdyq0uVMUS3VXHkulpHIFK9ybBMkF0UmMWFqt1aZ3eseaTCB0kotlzAklB/1oCrr51Xn6UApk=</DQ>
<InverseQ>BdwAX1oOqMruuPiqdRPaXoydw3uSwD63/ezafG/Sqyha9m356LyP9Ys3pZQduJb8TLlpBtdO6YgoW+sDjnNhZHAL9O2mZF0ViN5Nqhmk2qNvlzLaAOr0/Gu2Mw91BG6RVvEKOpp0We0p7zAuPV02tMiLmGaoUzG5XHcMtGrXWQ8=</InverseQ>
<D>LUbFUTJSwGNWABS4tiu5zevFlZORQZONXtZBdD3WMjvxhBojwVhRNQomVFB/PNeJlzbOTcAE2sBkA6r8xfFI9USm4jvCr/sSBm5O3VWAK3NyPlKPslTEJrOy64wOZ/dEgFgdoY5AN27U9zXs4zj+iG16vhFH7CCP9F+WSEcBVlnU+kPrAz7t1DcCYB9sckjC1p3n3Apm/FC5nyaOlhmhBHb5QSGwOQK3ICD5Ry5CCot0vN2yQmamLIq60cdy3wZyWt2j118ylMgrsJsLzdIUorBsw9NQH4v9KWGjZNBfGjhYty8M2kWClGWwBTDtQTC5wbOvTQepgyJXK50wTHel4Q==</D>
</RSAKeyValue>";
}
private static string GetSignature(string data)
{
string privateKey = getPrivateKey();
RSACryptoServiceProvider csp = new RSACryptoServiceProvider(2048);
csp.FromXmlString(privateKey);
byte[] inputBytes = Encoding.UTF8.GetBytes(data);
byte[] signatureBytes = csp.SignData(inputBytes, "SHA1");
return Convert.ToBase64String(signatureBytes);
}
}
我在 .net 中有一个方法,我想从 Nodejs 获得相同的输出。该代码负责使用私钥创建 Sha1 签名。这是我的 .net 代码:
private string GetSignature(string data)
{
RSACryptoServiceProvider csp = new RSACryptoServiceProvider(2048);
csp.FromXmlString(privateKey);
byte[] inputBytes = Encoding.UTF8.GetBytes(data);
byte[] signatureBytes = csp.SignData(inputBytes, "SHA1");
return Convert.ToBase64String(signatureBytes);
}
我的 nodejs 等效项是:
var sign = crypto.createSign('sha1');
sign.update(data);
sign.end();
var signed = sign.sign(pemKey,'base64');
但是,这两者的结果是不一样的。请帮我解决这个问题。
我写了两个程序,一个在 Node.js 中,另一个在 C# 中,以演示使用相同的密钥和相同的数据进行签名,在本例中为“hello world”。
两者的签名结果相同:
Node.js
NrBWcxfoUavH+6cG9rWRtfKKkMaiptrXvjeTlc9NG2ozu3YGBr17dphI3mZ24Khe6LsFQOpiJylg9i5eAxNR22yGDSRKM+SjsRe0pFVk58XdKCtQQs2IiNi12yPifA4AIBBPqCJSGLqTlRKx3urAkpkTAHCBTpMj2BJ95FuufIkzL90SdZYEz0QC8O9nNpatVYlmnCLdU/iAoc7D4gJIBBBzKxaCGL81tgOWf7pKKMPpkbWGH+6z1fNWnz4HDoIz+CfFwtInQP/nMhMvq5v5O3B/ndHrwYU6YwiewwOqYsvv/bMVXwOAWV5c22oFEPcdUgi6ehCwqcsRM5KtDgVf+g==
网络:
NrBWcxfoUavH+6cG9rWRtfKKkMaiptrXvjeTlc9NG2ozu3YGBr17dphI3mZ24Khe6LsFQOpiJylg9i5eAxNR22yGDSRKM+SjsRe0pFVk58XdKCtQQs2IiNi12yPifA4AIBBPqCJSGLqTlRKx3urAkpkTAHCBTpMj2BJ95FuufIkzL90SdZYEz0QC8O9nNpatVYlmnCLdU/iAoc7D4gJIBBBzKxaCGL81tgOWf7pKKMPpkbWGH+6z1fNWnz4HDoIz+CfFwtInQP/nMhMvq5v5O3B/ndHrwYU6YwiewwOqYsvv/bMVXwOAWV5c22oFEPcdUgi6ehCwqcsRM5KtDgVf+g==
希望对您有所帮助。在你的情况下,我想知道使用的键是否有任何不同,因为代码(两种语言)与你所拥有的非常相似。在任何情况下,如果您使这个示例正常运行,您也许就能理解您的代码中的失败点!
test-signature.js
function testSignature(data) {
const crypto = require('crypto');
const fs = require('fs');
const privateKey = fs.readFileSync('./private-key.pem', 'utf8');
const sign = crypto.createSign('SHA1');
sign.update(data);
sign.end();
const signature = sign.sign(privateKey);
console.log("Signature:", signature.toString('base64'));
}
testSignature("hello world");
private-key.pem
-----BEGIN RSA PRIVATE KEY----- MIIEogIBAAKCAQEAoTZ5Vl3o1pwH8pMNQNj47ff7WHJBjYQzGvMRstNjOWqQQnpW VjvXkquRC1xfw8l09AQxk+E3CGPmzHDxdvJFWwMIvzH//xQjvOj1LJiDiDbvMf+V QC4ntx4JgMAv5rW1DjkbpUJeRHjl9r/T17EGKtaf4srejkNRfTKxFMwWjPimCKS7 IOUIKbFYQXEgbMmL9Ow6CNnE/WVD3HahC4OjznkJdkRMrmVFDC8g7nWN0jipfaWO RdzgNdKByn3kYpo3irSgkwE5isdbOWe1tXImjkZgGbpn2eL8sUNpFAPwR81yjQWP uF1O/KO2Kstoc3nwpDo3L2ZGD0IWQNOJss3/mwIDAQABAoIBAC1GxVEyUsBjVgAU uLYruc3rxZWTkUGTjV7WQXQ91jI78YQaI8FYUTUKJlRQfzzXiZc2zk3ABNrAZAOq /MXxSPVEpuI7wq/7EgZuTt1VgCtzcj5Sj7JUxCazsuuMDmf3RIBYHaGOQDdu1Pc1 7OM4/ohter4RR+wgj/RflkhHAVZZ1PpD6wM+7dQ3AmAfbHJIwtad59wKZvxQuZ8m jpYZoQR2+UEhsDkCtyAg+UcuQgqLdLzdskJmpiyKutHHct8Gclrdo9dfMpTIK7Cb C83SFKKwbMPTUB+L/Slho2TQXxo4WLcvDNpFgpRlsAUw7UEwucGzr00HqYMiVyud MEx3peECgYEAzMnEOiaol4T6jcOIYaGhQD8Z1ZjB1uDmmizyHYQM4s1gTZDBtbqk ero20c1sKFeejQ5nBZGy8eN6vBNF1Stt73xkWeED5fXxHyUn6iN4SAT/++SO7Xfz FLzSLfpEWAc4i0w6Pi/tReEn3tYAJ1l2cXP2P/Sc46R2Wk3phI3hbCkCgYEAyYcT 1hTUeQ5Z9Rd9XRqygLz14VZGkKLa4IrhUKSHmHIeBeqIKXuD0ELkSgIxr679CdIL VcT6/uJPqJythYriRN3UHnUx5rvTaymaOP2Eq3s2bpuXTCqipftNTu2FysmdrjT5 qT/bpdRoVeoMAZDgRG7cjlJcsiExrebkZvtBRiMCgYB8f0T+HTZtNvijanXk9L/1 MOdhxUZCfeNzY1OlwfubfkPHo/M/qcIIomBlV78jH3FSS6kx54ukJikdYZIYsBhb eYIAah1WlhgKWSpU209qaS++UQrbLwrmVoxoSzd1VJ55gNP/rl9PFjyI6gyZ33d0 LY1NAEbI1djluWv3m9GpUQKBgBAssz7fdR4yNK4jMICkf+ctQ17OmeNJ7t9Oxj6+ tdNadWZsKHmL3Ex+0evOuUYseUqsfRRpNuv2JgaWbKbnOrnkQ/4d0d9++70CHcqt LlTFEt1Vx5LpaRyBSvcmwTJBdFJjFhardWmd3rHmkwgdJKLZcwJJQf9aAq6+dV5+ lAKZAoGABdwAX1oOqMruuPiqdRPaXoydw3uSwD63/ezafG/Sqyha9m356LyP9Ys3 pZQduJb8TLlpBtdO6YgoW+sDjnNhZHAL9O2mZF0ViN5Nqhmk2qNvlzLaAOr0/Gu2 Mw91BG6RVvEKOpp0We0p7zAuPV02tMiLmGaoUzG5XHcMtGrXWQ8= -----END RSA PRIVATE KEY-----
Program.cs
using System;
using System.Security.Cryptography;
using System.Text;
public class Program
{
public static void Main()
{
testSignature();
}
static void testSignature()
{
Console.WriteLine(GetSignature("hello world"));
}
static String getPrivateKey()
{
return @"<RSAKeyValue>
<Modulus>oTZ5Vl3o1pwH8pMNQNj47ff7WHJBjYQzGvMRstNjOWqQQnpWVjvXkquRC1xfw8l09AQxk+E3CGPmzHDxdvJFWwMIvzH//xQjvOj1LJiDiDbvMf+VQC4ntx4JgMAv5rW1DjkbpUJeRHjl9r/T17EGKtaf4srejkNRfTKxFMwWjPimCKS7IOUIKbFYQXEgbMmL9Ow6CNnE/WVD3HahC4OjznkJdkRMrmVFDC8g7nWN0jipfaWORdzgNdKByn3kYpo3irSgkwE5isdbOWe1tXImjkZgGbpn2eL8sUNpFAPwR81yjQWPuF1O/KO2Kstoc3nwpDo3L2ZGD0IWQNOJss3/mw==</Modulus>
<Exponent>AQAB</Exponent>
<P>zMnEOiaol4T6jcOIYaGhQD8Z1ZjB1uDmmizyHYQM4s1gTZDBtbqkero20c1sKFeejQ5nBZGy8eN6vBNF1Stt73xkWeED5fXxHyUn6iN4SAT/++SO7XfzFLzSLfpEWAc4i0w6Pi/tReEn3tYAJ1l2cXP2P/Sc46R2Wk3phI3hbCk=</P>
<Q>yYcT1hTUeQ5Z9Rd9XRqygLz14VZGkKLa4IrhUKSHmHIeBeqIKXuD0ELkSgIxr679CdILVcT6/uJPqJythYriRN3UHnUx5rvTaymaOP2Eq3s2bpuXTCqipftNTu2FysmdrjT5qT/bpdRoVeoMAZDgRG7cjlJcsiExrebkZvtBRiM=</Q>
<DP>fH9E/h02bTb4o2p15PS/9TDnYcVGQn3jc2NTpcH7m35Dx6PzP6nCCKJgZVe/Ix9xUkupMeeLpCYpHWGSGLAYW3mCAGodVpYYClkqVNtPamkvvlEK2y8K5laMaEs3dVSeeYDT/65fTxY8iOoMmd93dC2NTQBGyNXY5blr95vRqVE=</DP>
<DQ>ECyzPt91HjI0riMwgKR/5y1DXs6Z40nu307GPr6101p1ZmwoeYvcTH7R6865Rix5Sqx9FGk26/YmBpZspuc6ueRD/h3R3377vQIdyq0uVMUS3VXHkulpHIFK9ybBMkF0UmMWFqt1aZ3eseaTCB0kotlzAklB/1oCrr51Xn6UApk=</DQ>
<InverseQ>BdwAX1oOqMruuPiqdRPaXoydw3uSwD63/ezafG/Sqyha9m356LyP9Ys3pZQduJb8TLlpBtdO6YgoW+sDjnNhZHAL9O2mZF0ViN5Nqhmk2qNvlzLaAOr0/Gu2Mw91BG6RVvEKOpp0We0p7zAuPV02tMiLmGaoUzG5XHcMtGrXWQ8=</InverseQ>
<D>LUbFUTJSwGNWABS4tiu5zevFlZORQZONXtZBdD3WMjvxhBojwVhRNQomVFB/PNeJlzbOTcAE2sBkA6r8xfFI9USm4jvCr/sSBm5O3VWAK3NyPlKPslTEJrOy64wOZ/dEgFgdoY5AN27U9zXs4zj+iG16vhFH7CCP9F+WSEcBVlnU+kPrAz7t1DcCYB9sckjC1p3n3Apm/FC5nyaOlhmhBHb5QSGwOQK3ICD5Ry5CCot0vN2yQmamLIq60cdy3wZyWt2j118ylMgrsJsLzdIUorBsw9NQH4v9KWGjZNBfGjhYty8M2kWClGWwBTDtQTC5wbOvTQepgyJXK50wTHel4Q==</D>
</RSAKeyValue>";
}
private static string GetSignature(string data)
{
string privateKey = getPrivateKey();
RSACryptoServiceProvider csp = new RSACryptoServiceProvider(2048);
csp.FromXmlString(privateKey);
byte[] inputBytes = Encoding.UTF8.GetBytes(data);
byte[] signatureBytes = csp.SignData(inputBytes, "SHA1");
return Convert.ToBase64String(signatureBytes);
}
}