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

Web Crypto API正式版无sha-224,如何生成该哈希值?

如何通过Web Crypto API生成SHA-224哈希值

正式版Web Crypto API确实未将SHA-224纳入标准支持,但可以通过两种可靠方式实现需求:

1. 基于SHA-256手动推导SHA-224

SHA-224本质是SHA-256的变种,仅初始哈希值不同,且最终结果需截断为前28字节(224位)。你可以通过以下步骤实现:

  • 复用SHA-256的算法逻辑,但替换为SHA-224专属的初始哈希值
  • 计算完成后截取结果的前28字节作为最终哈希

以下是可运行的JavaScript实现示例(基于公开的SHA-256实现修改初始值):

async function generateSHA224(input) {
    // SHA-224专属初始哈希值(与SHA-256不同)
    const initH = [
        0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,
        0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4
    ];

    // 消息编码与SHA-256核心逻辑(替换初始值)
    const encoder = new TextEncoder();
    const data = encoder.encode(input);
    const hash = await customSHA256(data, initH);
    
    // 截取前28字节(224位)并转为十六进制字符串
    return Array.from(new Uint8Array(hash.slice(0, 28)))
        .map(b => b.toString(16).padStart(2, '0'))
        .join('');
}

// 自定义SHA-256实现,支持传入初始哈希值
async function customSHA256(data, initialH) {
    // 实现SHA-256的消息填充、压缩轮次等核心逻辑
    // 此处省略完整SHA-256算法代码,可参考公开的JavaScript SHA-256实现,将默认初始值替换为传入的initialH
    // 示例框架:
    const paddedData = padSHA256(data);
    const blocks = splitIntoBlocks(paddedData);
    let h = [...initialH];
    
    for (const block of blocks) {
        h = compressBlock(block, h);
    }
    
    // 将32位整数数组转为Uint8Array
    return new Uint8Array(h.flatMap(num => [
        (num >> 24) & 0xff,
        (num >> 16) & 0xff,
        (num >> 8) & 0xff,
        num & 0xff
    ]));
}

// 辅助函数:SHA-256消息填充逻辑
function padSHA256(data) {
    const bitLength = data.length * 8;
    const padding = new Uint8Array(64 - (data.length % 64));
    padding[0] = 0x80;
    
    const lengthArray = new Uint8Array(8);
    for (let i = 0; i < 8; i++) {
        lengthArray[7 - i] = (bitLength >> (i * 8)) & 0xff;
    }
    
    return new Uint8Array([...data, ...padding, ...lengthArray]);
}

// 辅助函数:分块与压缩逻辑(需补充完整SHA-256压缩轮次实现)
function splitIntoBlocks(data) { /* ... */ }
function compressBlock(block, h) { /* ... */ }

2. 使用第三方加密库简化实现

如果不想手动编写算法逻辑,可以依赖成熟的第三方加密库(如CryptoJS),这类库通常内置了SHA-224支持,示例代码:

// 需提前引入CryptoJS库
function getSHA224Hash(input) {
    return CryptoJS.SHA224(input).toString(CryptoJS.enc.Hex);
}

注意:部分浏览器可能通过非标准扩展支持直接将"SHA-224"传入subtle.digest,但这不属于规范内容,兼容性无法保证,不建议在生产环境依赖。

内容的提问来源于stack exchange,提问作者David Dal Busco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 23:12:06