Nodejs做RSA验证实例与豌豆荚RSA验证的实现,支付宝的RSA也一样

在这里发个文章也希望能对使用nodejs的人有所帮助。网上我都翻墙了都没有相关的帮助文档,实在是气死我了。 0.0

代码如下:

var Crypto = require(‘crypto’);//豌豆荚提供的公钥,他们只提供了没换行过的字符串,,在这里我们要严格按照64位一行来进行换行,并且加上他们.pem文件中的开头和结尾。var pubkey = "—–BEGIN PUBLIC KEY—–" + "\r\n" +"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCd95FnJFhPinpNiE/h4VA6bU1r" + "\r\n" +"zRa5+a25BxsnFX8TzquWxqDCoe4xG6QKXMXuKvV57tTRpzRo2jeto40eHKClzEgj" + "\r\n" +"x9lTYVb2RFHHFWio/YGTfnqIPTVpi7d7uHY+0FZ0lYL5LlW4E2+CQMxFOPRwfqGz" + "\r\n" +"Mjs1SDlH7lVrLEVy6QIDAQAB" + "\r\n" +"—–END PUBLIC KEY—–";function VerifyQueryTest(){

//豌豆荚充值成功返回的示例数据var data = "{\&;timeStamp\&;:1363848203377,\&;orderId\&;:100001472,\&;money\&;:4000,\&;chargeType\&;:\&;BALANCEPAY\&;,\&;appKeyId\&;:100000000,\&;buyerId\&;:1,\&;cardNo\&;:null}";

//豌豆荚使用自己的私钥对上面示例数据生成的64位签名var sig = "VwnhaP9gAbDD2Msl3bFnvsJfgz3NOAqM/JVexl1myHfsrHX3cRrFXz86cNO+oNYWBBM7m/5ZdtHRpSArZWFuZHysKfirO3BynUaIYSAiD2J1Xio5q9+Yr83cI/ESyemVAt7lK4lMW3ReSwmAcOs0kDZLAxVIb++EPy0y2NpH4kI=";

var verify = Crypto.createVerify(‘RSA-SHA1’);verify.update(data);var result = verify.verify(pubkey, sig, ‘base64’);console.log("验证结果:"+result);}

在这里做一些说明:

其实大家都知道,生成的公钥和私钥都是严格按照OpenSSL的方式来生成的。而nodejs中给我们的demo中用的是通用生成的公钥来进行签名和验证,所以大部分人用在其他平台的RSA验证中都会出问题,我在这里对以下一些问题作出一些说明:

1.PEM routines:PEM_read_bio:no start,说明你的publickey缺少了开始的"—–BEGIN PUBLIC KEY—–"

2.9080:error:0906D066:PEM routines:PEM_read_bio:bad,说明你缺少了结尾的"—–END PUBLIC KEY—–"

上面两点要注意的,原生生成的.pem文件里的开头和结尾是—–BEGIN CERTIFICATE—–和—–END CERTIFICATE—–,而这个开始和结尾哪怕是一个字母不同都会报错。

所以大家只要找到签名所用的publickey的原始文件即可。或者索取到完整的公钥内容。

3.验证签名所用的签名格式,nodejs的实例说明中使用的是RSA-SHA256,实际上有很多平台,其中支付宝和豌豆荚用的就是RSA-SHA1,所以这里也不要搞错了。

4.生成的签名格式是base64,这也是严格按照通用标准的。

5.其实公钥的生成都是有一定格式要求的,比如64位一行进行换行等等更多的一些通用的格式要求。

其实只要把算法的一些概念搞懂了,所有的一切都是举一反三的,在这里我弄懂这个花了足足2天时间。

其中有几篇文章对我帮助非常大的。

我是用Nodejs+mongodb+unity3d搭建框架的,可以进群一起讨论一下有关nodejs服务器框架的问题

Unity项目框架交流群:112378243

?from_id=210678&type=syn&fromtitle=RSA&fr=aladdin

年轻是我们唯一拥有权利去编织梦想的时光

Nodejs做RSA验证实例与豌豆荚RSA验证的实现,支付宝的RSA也一样

相关文章:

你感兴趣的文章:

标签云: