为什么nodejs加密符号功能仅接受privateKey pem格式?
首先,我们使用elliptic加密包。符号函数如下所示:
signByPriv = function (privKeyData, text) {
let msgHash = getmsgHash(text, "SHA-384");
let key = ec.keyFromPrivate(Buffer.from(privKeyData,'base64').toString('hex'), 'hex')
let signature = key.sign(msgHash);
return signature
}
然后我们想将其更改为nodejs版本,因为nodejs在后台使用openssl。这样会更快
起初我的符号功能如下:
signByPriv = function (privKeyData, text) {
const sign1 = crypto.createSign('SHA384'); //hash do inside
sign1.write(text);
sign1.end();
const signature = sign1.sign(privKeyData, 'hex');
return signature;
}
它将抱怨该错误:
内部/密码/sig.js:86const ret = this [kHandle] .sign(数据,格式,类型,密码,rsaPadding,
错误:错误:0909006C:PEM例程:get_name:无起始行
所以我检查了nodejs文档,发现它需要以pem格式传递privKey。
signByPriv = function (privKeyData, text) {
let key = turnBase64PrivToPemKey(privKeyData) //base64 => pem
const sign1 = crypto.createSign('SHA384'); //hash do inside
sign1.write(text);
sign1.end();
const signature = sign1.sign(privKeyData, 'hex');
return signature;
}
turnBase64PrivToPemKey = function (base64Priv) {
var key_hex = Buffer.from(base64Priv, 'base64').toString('hex');
ecdh.setPrivateKey(key_hex, 'hex')
var pubKey_hex = ecdh.getPublicKey().toString('hex');
//pem格式私钥文件是由固定字符加上私钥和公钥拼接而成==同一条曲线,固定字符相同
var mykey = '308187020100301306072a8648ce3d020106082a8648ce3d030107046d306b0201010420' + key_hex + 'a144034200' + pubKey_hex;
privKey = '-----BEGIN PRIVATE KEY-----\n' + Buffer.from(mykey, 'hex').toString('base64') + '\n-----END PRIVATE KEY-----';
pubKey = crypto.createPublicKey(privKey); //也可恢复出公钥
let Key = {
privKey,
pubKey
}
return Key;
}
并且很好,签名和验证功能都可以正常工作。
但是后端可能做同样愚蠢的事情...
我们选择的曲线是prime256v1
const ecdh = crypto.createECDH('prime256v1')
所以,我想知道为什么nodejs sign func不能只接受base64 priv?
因为pem格式仅由私钥,公钥和其他固定字符串组成。
回答如下:PEM是由OpenSSL处理的标准。它定义了标题行,页脚行和特定类型的base 64以及处理数据的方式。标题行和页脚行也清楚地标识了以base 64编码的数据类型。它最初主要用于邮件; PEM意味着增强隐私的邮件。
因此,这些是相对于base 64的优势。您可以清楚地找到PEM的开始和结束,PEM中包含的对象的类型等。另外,请注意,PEM早于Base 64的任何正式标准。它早已存在,但每个需要编码/解码的标准都只是在内部对其进行了重新定义。
是的,这就是OpenSSL开始使用PEM的方式,而您提到的NodeJS就是这样使用的。
请注意,许多库还包含base 64解码器。 内部
通常以base 64为二进制格式,称为DER,包含由ASN.1数据描述语言描述的数据。如果您的库可以处理DER,则您可以自己解码base 64并在密码库中使用ASN.1功能。 OpenSSL命令行可以通过base64
命令和-inform DER
开关执行此操作。
为什么nodejs加密符号功能仅接受privateKey pem格式?
首先,我们使用elliptic加密包。符号函数如下所示:
signByPriv = function (privKeyData, text) {
let msgHash = getmsgHash(text, "SHA-384");
let key = ec.keyFromPrivate(Buffer.from(privKeyData,'base64').toString('hex'), 'hex')
let signature = key.sign(msgHash);
return signature
}
然后我们想将其更改为nodejs版本,因为nodejs在后台使用openssl。这样会更快
起初我的符号功能如下:
signByPriv = function (privKeyData, text) {
const sign1 = crypto.createSign('SHA384'); //hash do inside
sign1.write(text);
sign1.end();
const signature = sign1.sign(privKeyData, 'hex');
return signature;
}
它将抱怨该错误:
内部/密码/sig.js:86const ret = this [kHandle] .sign(数据,格式,类型,密码,rsaPadding,
错误:错误:0909006C:PEM例程:get_name:无起始行
所以我检查了nodejs文档,发现它需要以pem格式传递privKey。
signByPriv = function (privKeyData, text) {
let key = turnBase64PrivToPemKey(privKeyData) //base64 => pem
const sign1 = crypto.createSign('SHA384'); //hash do inside
sign1.write(text);
sign1.end();
const signature = sign1.sign(privKeyData, 'hex');
return signature;
}
turnBase64PrivToPemKey = function (base64Priv) {
var key_hex = Buffer.from(base64Priv, 'base64').toString('hex');
ecdh.setPrivateKey(key_hex, 'hex')
var pubKey_hex = ecdh.getPublicKey().toString('hex');
//pem格式私钥文件是由固定字符加上私钥和公钥拼接而成==同一条曲线,固定字符相同
var mykey = '308187020100301306072a8648ce3d020106082a8648ce3d030107046d306b0201010420' + key_hex + 'a144034200' + pubKey_hex;
privKey = '-----BEGIN PRIVATE KEY-----\n' + Buffer.from(mykey, 'hex').toString('base64') + '\n-----END PRIVATE KEY-----';
pubKey = crypto.createPublicKey(privKey); //也可恢复出公钥
let Key = {
privKey,
pubKey
}
return Key;
}
并且很好,签名和验证功能都可以正常工作。
但是后端可能做同样愚蠢的事情...
我们选择的曲线是prime256v1
const ecdh = crypto.createECDH('prime256v1')
所以,我想知道为什么nodejs sign func不能只接受base64 priv?
因为pem格式仅由私钥,公钥和其他固定字符串组成。
回答如下:PEM是由OpenSSL处理的标准。它定义了标题行,页脚行和特定类型的base 64以及处理数据的方式。标题行和页脚行也清楚地标识了以base 64编码的数据类型。它最初主要用于邮件; PEM意味着增强隐私的邮件。
因此,这些是相对于base 64的优势。您可以清楚地找到PEM的开始和结束,PEM中包含的对象的类型等。另外,请注意,PEM早于Base 64的任何正式标准。它早已存在,但每个需要编码/解码的标准都只是在内部对其进行了重新定义。
是的,这就是OpenSSL开始使用PEM的方式,而您提到的NodeJS就是这样使用的。
请注意,许多库还包含base 64解码器。 内部
通常以base 64为二进制格式,称为DER,包含由ASN.1数据描述语言描述的数据。如果您的库可以处理DER,则您可以自己解码base 64并在密码库中使用ASN.1功能。 OpenSSL命令行可以通过base64
命令和-inform DER
开关执行此操作。