From 30706da9fbd4097d614b4a0809df14becd32e6c4 Mon Sep 17 00:00:00 2001 From: Luk Lu Date: Sat, 8 May 2021 22:42:08 +0800 Subject: [PATCH] =?UTF-8?q?crypto.sign/verify=20=E5=9C=A8=E6=B5=8F?= =?UTF-8?q?=E8=A7=88=E5=99=A8=E4=B8=AD=E4=B8=8D=E5=AD=98=E5=9C=A8=EF=BC=8C?= =?UTF-8?q?=E6=8D=A2=E5=9B=9E=E5=8E=9F=E6=9D=A5=E7=9A=84=E6=96=B9=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.js | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/index.js b/index.js index 9c7150f..92ee8fc 100644 --- a/index.js +++ b/index.js @@ -279,11 +279,11 @@ class TICrypto { } else if (seckey.length === 64) { // 纯 crypto let seckeyPEM = await new keyman.Key('oct', this.hex2buf(seckey), { namedCurve: 'P-256K' }).export('pem') // 私钥导出的der格式为144字节。 - // let signer = crypto.createSign(my.HASHER_LIST.indexOf(hasher) >= 0 ? hasher : my.HASHER) // 注意,不知为何,hasher必须含有'sha'才能完成签名,例如 sha1, sha256, sha512, sha3, RSA-SHA1, id-rsassa-pkcs1-v1_5-with-sha3-224, 其他都会报错。 - // signer.update(this.hash(data)).end() - // let signature = signer.sign(seckeyPEM, 'hex') - // since nodejs 12, 有了 crypto.sign 方法: - let signature = crypto.sign(my.HASHER_LIST.indexOf(hasher) >= 0 ? hasher : my.HASHER, Buffer.from(this.hash(data)), seckeyPEM).toString('hex') + let signer = crypto.createSign(my.HASHER_LIST.indexOf(hasher) >= 0 ? hasher : my.HASHER) // 注意,不知为何,hasher必须含有'sha'才能完成签名,例如 sha1, sha256, sha512, sha3, RSA-SHA1, id-rsassa-pkcs1-v1_5-with-sha3-224, 其他都会报错。 + signer.update(this.hash(data)).end() + let signature = signer.sign(seckeyPEM, 'hex') + // since nodejs 12, 有了 crypto.sign 方法,但在浏览器中无效: + // let signature = crypto.sign(my.HASHER_LIST.indexOf(hasher) >= 0 ? hasher : my.HASHER, Buffer.from(this.hash(data)), seckeyPEM).toString('hex') return signature // 发现同样的输入,nodejs里每次调用会生成不同的 signature, 且长度不定(140,142,144 hex) 但都可以通过 verify。但在浏览器里调用,signature却是固定的。 } } @@ -325,13 +325,8 @@ class TICrypto { // let verifier = crypto.createVerify(my.HASHER_LIST.indexOf(hasher) >= 0 ? hasher : my.HASHER) // verifier.update(this.hash(data)).end() // end() 在 nodejs 12 里返回verifier自身,但在浏览器里返回 undefined,因此不能串联运行。 // let verified = verifier.verify(pubkeyPEM, signature, 'hex') // 如果给signature添加1位hex,crypto 的 verify结果也是true! 估计因为一位hex不被转成字节。但减少1位会导致false - // since nodejs 12, 有了 crypto.verify 方法: - let verified = crypto.verify( - my.HASHER_LIST.indexOf(hasher) >= 0 ? hasher : my.HASHER, - Buffer.from(this.hash(data)), - pubkeyPEM, - Buffer.from(signature, 'hex') - ) + // since nodejs 12, 有了 crypto.verify 方法,但在浏览器中无效: + // let verified = crypto.verify(my.HASHER_LIST.indexOf(hasher) >= 0 ? hasher : my.HASHER, Buffer.from(this.hash(data)), pubkeyPEM, Buffer.from(signature, 'hex')) return verified } }