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

在这里发个文章也希望能对使用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

http://baike.baidu.com/view/10613.htm?from_id=210678&type=syn&fromtitle=RSA&fr=aladdin

http://blog.csdn.net/huyiyang2010/article/details/38066273

http://www.oschina.net/question/163899_24007

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值