如何使用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
相关产品推荐
相关产品推荐

