You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在纯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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 04:02:53