node.js端RSA签名,cocos2dx进行RSA验证

node.js端使用ursa模块,因为node.js自带的crypto API看着好坑爹,ursa的就明了多了,傻瓜必备!

服务端代码:

var privPem = fs.readFileSync(‘private_key.pem’);//这里演示从pem文件创建私钥,privPem是一个Buffer
var priv = ursa.createPrivateKey(privPem);
var content = new Buffer(plain);//plain是原文,String。buffer默认utf8编码。
var sig = priv.hashAndSign(‘sha1’, content, ‘utf8’, ‘base64’);//对content进行sha1摘要,然后对摘要进行签名。content是utf8编码,签名出来的sig是base64编码

/* verify代码
var pubk = ‘—–BEGIN PUBLIC KEY—–
xxxxxxxxxxx
—–END PUBLIC KEY—–‘;//这里演示不通过文件读取公钥的方式。注意,每一段都需要
分隔,否则创建公钥失败

var pub = ursa.createPublicKey(new Buffer(pubk));
if(pub.hashAndVerify(‘sha1’, new Buffer(content, ‘utf8’), sig, ‘base64’)) {
console.log(‘verified’);
}
*/

客户端cocos2dx,自带的libcurl.a中已经有openssl和libcrypto,所以项目中只需要加入openssl的头文件即可通过编译。
客户端代码:

        BIO* bufio = BIO_new_mem_buf((void*)PUBLIC_KEY, -1);    //-1表示让函数内部自行推算key长度

RSA* rsa = PEM_read_bio_RSA_PUBKEY(bufio, NULL, NULL, NULL);

BIO_free(bufio);

 

//sha1结果固定是20字节(SHA_DIGEST_LENGTH)

const unsigned char* sha1 = SHA1((const unsigned char *)content.c_str(), content.size(), NULL);

 

//必须强制使用SHA_DIGEST_LENGTH,不能使用strlen(sha1),因为sha1中可能有。这个bug曾让我抓狂了好一阵。

int verifyResult = RSA_verify(NID_sha1, sha1, SHA_DIGEST_LENGTH, (const unsigned char*)sig.c_str(), sig.size(), rsa);//verifyResult == 1表示验证成功,0表示失败

RSA_free(rsa);

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据