在Node.js中使用Base-64 PKCS-8进行签名/解码

时间:2017-03-07 00:27:34

标签: javascript node.js

目前正努力尝试与Walmart Partners API建立联系,并在加密方面遇到一些问题,而且我在Javascript / Node中没有找到任何有关此问题的文档帮助。

文档说明:

  

通过以下方式对此数据的字节数组表示进行签名:

     

解码私钥的Base-64,PKCS-8表示。注意   密钥是使用PKCS-8编码的。各种语言的图书馆   提供指定密钥是否采用此格式而不是密钥的功能   其他冲突的格式,如PKCS-1。

     

使用密钥的此字节表示来使用数据签名   SHA-256与RSA。

     

使用Base-64对生成的签名进行编码。

我有私钥,并找到了很好的文档“chilkat”包。唯一的问题是我们的开发系统是Windows,在Windows 10 64bit上存在问题。如果我使用64位,它不能识别为64位系统,所以我甚至无法安装包。

此外,似乎chilkat软件包至少需要Node版本4,我们尝试升级到Node 4以使用它,并且该项目目前无法使用该版本而没有因我们使用的其他软件包而导致的一些错误。所以至少在这些错误得到解决之前,Node 4不是一个选项,看起来Chilkat已经不在了......

所以我找到了anotehr NPM包来帮助解决这个问题:https://github.com/rzcoder/node-rsa

使用该软件包,我遇到了解码/签名工作的问题......我发现文档很混乱,而且我在类似问题上找到的唯一帮助是C#...

关于如何通过node-rsa软件包实现沃尔玛要求的任何建议?

1 个答案:

答案 0 :(得分:3)

使用node-rsa,我能够通过两个步骤生成有效的Walmart API签名:

const NodeRSA = require('node-rsa');

// 1. Decode the private key with base64 then pkcs8
const key = new NodeRSA();
key.importKey(new Buffer(encodedPrivateKey, 'base64'), 'pkcs8-private-der');
const privateKey = key.exportKey();

// 2. Sign the data with the decoded private key and sha256 then encode it with base64
const data = `${consumerId}\n${url}\n${method}\n${timestamp}\n`;
const signature = new NodeRSA(privateKey, {signingScheme: 'sha256'}).sign(data).toString('base64');