Node.js与PHP之间通过RSA算法实现签名验证
做过web开发的同学都知道我们经常在接口间交互的时候为了防止数据伪造并 且保证安全性我们会采用签名的方式进行验证, 签名的算法我们一般选择RSA非对称加密算法。想了解更多签名与RSA算法知识可以去查阅PKCS#1、PKCS#7相关资料。
笔者在做利用Node.js做单点登录的时候涉及到了Node.js项目中产生的签名,然后需要到PHP项目中去验签,具体实现如下。
首先准备RSA公钥和私钥,格式均为PEM
openssl产生pem格式私钥
openssl genrsa -out private_key.pem 1024
openssl产生pem格式公钥
openssl rsa -in private_key.pem -pubout -out public_key.pem
Node.js中实现签名和验证
默认签名后转换成hex格式
var crypto = require('crypto');
function rsaSign(key, data,encode){
var sign = crypto.createSign('RSA-SHA256');
sign.update(data);
var sig = sign.sign(key, encode||'hex');
return sig;
}
function rsaVerify(pubKey, sig, data,encode){
var verify = crypto.createVerify('RSA-SHA256');
verify.update(data);
return verify.verify(pubKey, sig, encode||'hex');
}
PHP中实现签名和验证
对应的hex转码的验签
function verifySign($pubKey,$data,$sign){
$beginIndex=0;
$signHexStr='';
for(;;){
if ($beginIndex>=strlen($sign)){
break;
}
$charCode=substr($sign,$beginIndex,2);
$signHexStr.=chr(hexdec($charCode));
$beginIndex+=2;
}
return openssl_verify($data,$signHexStr,$pubKey,'sha256WithRSAEncryption');
}
Node.js中使用
let signature=rsaSign(config.key.private,'plantext')
console.log(signature)
let r=rsaVerify(config.key.public,signature,'plantext')
console.log(r)
PHP中使用
verifySign($key,'plantext',$sign);
关于如何在Node.js和PHP之前通过RSA算法实现签名验证就介绍到这里,还是比较简单的。