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