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

如何使用Forge库对二进制数据生成正确的SHA256哈希值?

解决Forge库生成正确SHA256哈希值的问题

你遇到的问题核心在于Forge库默认将输入视为UTF-8编码的字符串,而不是原始二进制数据,直接传入Uint8Array或者不指定编码的Buffer会导致字节被错误解析,从而得到错误的哈希值。

错误尝试的原因分析

  • 尝试1直接将Uint8Array传入md.update():Forge会把数组对象转换为字符串(比如"[object Uint8Array]"),显然这不是你要处理的二进制内容,所以哈希完全不对。
  • 尝试2用forge.util.createBuffer(data)但未指定编码:默认会以UTF-8解析数据,而你的二进制字节(比如0x01)不是有效的UTF-8字符,会被替换为替代字符,导致哈希错误。

正确的实现方式

你需要明确告诉Forge处理的是原始二进制数据,有两种可靠的方法:

方法1:将Uint8Array转换为Forge的二进制字符串

使用forge.util.binary.raw.encode()把Uint8Array转换为Forge能识别的原始二进制字符串,再进行哈希计算:

let data = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
const md = forge.md.sha256.create();
// 将Uint8Array转换为原始二进制字符串
const binaryStr = forge.util.binary.raw.encode(data);
md.update(binaryStr);
let hex = md.digest().toHex(); 
// 输出:66840dda154e8a113c31dd0ad32f7f3a366a80e8136979d8f5a101d3d29d6f72

方法2:创建Buffer时指定raw编码

在调用forge.util.createBuffer()时,第二个参数传入'raw',明确表示这是原始二进制数据:

let data = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
const md = forge.md.sha256.create();
// 创建原始二进制Buffer
let buffer = forge.util.createBuffer(data, 'raw');
md.update(buffer);
let hex = md.digest().toHex(); 
// 同样得到正确的哈希值

原理说明

Forge的raw编码模式会直接读取每个字节的原始值,不会进行任何字符编码转换,这样就能和sha256sum工具、Web Crypto API的处理逻辑保持一致,从而得到正确的SHA256哈希结果。

内容的提问来源于stack exchange,提问作者Michael

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:13:32