如何在纯Node.js环境中复现openssl sha1的功能?
如何在Node.js中得到与openssl sha1一致的公钥SHA1值
你之前的问题出在直接对PEM格式的字符串做SHA1计算,但openssl sha1处理公钥时,实际是先把PEM解码成DER格式的二进制ASN.1数据,再对这个二进制数据计算SHA1。
正确的做法是用Node.js的crypto模块先解析公钥,导出其DER格式的二进制数据,再计算SHA1:
const crypto = require('crypto'); const key = `-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA50usDP38lUfcpTKmiGEt oIeUQlJbSZi8/FNshil+Wf4/oyWPtzQeZL9NoWvtDoQit5dRpRU+5c2e5j3iYlOl JcfBX6S/HRdrJHD8xirsNRVSMq4woQbd2QcniX1fwWLhJDU8XNaTYwEGQSTnkzxA NpvwXMixAip+Nr0YMnZOToR6gu0t0euCUWpiypr/Zm40ppeAYxZzghHcVB4zbkOB zN0h1rIRQ6It7fv12Kd3u6semGCEtJcYBo0ZJsucRQDUpTTGzuEChI35/Q94W4QH evQ+JD68G2jQ/eOknYHoVUdjTYh3GJaiOpu+GDJXu3GHK18JjZmM0Lsmw/Jbypfj wwIDAQAB -----END PUBLIC KEY-----`; // 解析公钥,导出DER格式的二进制Buffer const publicKey = crypto.createPublicKey(key); const derBuffer = publicKey.export({ type: 'spki', format: 'der' }); // 计算DER数据的SHA1 const sha1Hash = crypto.createHash('sha1').update(derBuffer).digest('hex'); console.log("匹配openssl的SHA1值:", sha1Hash); // 输出64166b841bbb61c3f0dd7cefebb62bd79debce66
为什么之前的方法不对?
- 你之前的代码都是对PEM字符串(包含BEGIN/END标记、换行符的文本)做处理,不管怎么删标记或换行,本质还是在处理文本字符串的哈希。
- 而
openssl sha1处理公钥文件时,会自动识别PEM格式,解码出里面的二进制DER数据,再计算哈希——这才是两者结果不一致的核心原因。
内容的提问来源于stack exchange,提问作者Aurelia Peters
相关产品推荐
相关产品推荐

