最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

为什么nodejs加密符号功能仅接受privateKey pem格式?

IT培训 admin 8浏览 0评论

为什么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开关执行此操作。
发布评论

评论列表 (0)

  1. 暂无评论