首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

WebCrypto JS SHA256 HMAC不匹配

基础概念

Web Crypto API 是 JavaScript 中的一个内置库,用于执行加密操作。SHA-256 是一种安全哈希算法,用于生成数据的固定长度摘要。HMAC(Hash-based Message Authentication Code)是一种使用密钥和哈希函数生成消息认证码的方法。

相关优势

  1. 安全性:SHA-256 和 HMAC 都是经过广泛验证的安全算法。
  2. 性能:Web Crypto API 在现代浏览器中优化良好,性能较高。
  3. 标准化:这些算法都是国际标准,广泛支持。

类型

  • SHA-256:一种哈希算法,生成 256 位的哈希值。
  • HMAC:基于哈希的消息认证码,使用密钥和哈希函数生成认证码。

应用场景

  • 数据完整性:确保数据在传输过程中未被篡改。
  • 身份验证:验证消息的来源和完整性。
  • 数字签名:用于数字签名和验证。

问题:WebCrypto JS SHA256 HMAC不匹配

原因

HMAC 不匹配通常是由于以下原因之一:

  1. 密钥不一致:生成 HMAC 时使用的密钥与验证时使用的密钥不一致。
  2. 数据不一致:生成 HMAC 时使用的数据与验证时使用的数据不一致。
  3. 算法实现差异:不同库或环境对算法的实现可能存在细微差异。

解决方法

  1. 检查密钥:确保生成和验证 HMAC 时使用的密钥完全一致。
  2. 检查数据:确保生成和验证 HMAC 时使用的数据完全一致。
  3. 统一环境:确保在相同的环境中进行生成和验证操作。

示例代码

以下是一个使用 Web Crypto API 生成和验证 HMAC 的示例:

代码语言:txt
复制
async function generateHMAC(key, data) {
  const encoder = new TextEncoder();
  const keyBuffer = encoder.encode(key);
  const dataBuffer = encoder.encode(data);

  const cryptoKey = await window.crypto.subtle.importKey(
    'raw',
    keyBuffer,
    { name: 'HMAC', hash: { name: 'SHA-256' } },
    false,
    ['sign']
  );

  const signature = await window.crypto.subtle.sign('HMAC', cryptoKey, dataBuffer);
  return signature;
}

async function verifyHMAC(key, data, signature) {
  const encoder = new TextEncoder();
  const keyBuffer = encoder.encode(key);
  const dataBuffer = encoder.encode(data);

  const cryptoKey = await window.crypto.subtle.importKey(
    'raw',
    keyBuffer,
    { name: 'HMAC', hash: { name: 'SHA-256' } },
    false,
    ['verify']
  );

  const isValid = await window.crypto.subtle.verify('HMAC', cryptoKey, signature, dataBuffer);
  return isValid;
}

// 示例用法
(async () => {
  const key = 'my-secret-key';
  const data = 'Hello, World!';
  const signature = await generateHMAC(key, data);
  console.log('Generated HMAC:', signature);

  const isValid = await verifyHMAC(key, data, signature);
  console.log('HMAC Verification:', isValid);
})();

参考链接

通过以上步骤和示例代码,您应该能够诊断并解决 WebCrypto JS SHA256 HMAC 不匹配的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 【玩转 EdgeOne】在边缘函数实现腾讯云API 3.0签名

    解决办法 用JS纯手写一个API 3.0的签名函数使用 目录 给出写好的签名代码 讲解使用方法 拿获取轻量应用服务器可用区列表举例,演示如何使用(需要Demo修改的可以直接跳到这) 一、签名代码 相关的边缘函数...data) { const importedKey = await crypto.subtle.importKey( 'raw', key, { name: 'HMAC...密钥,进控制台访问密钥获取 SecretKey:API密钥,进控制台访问密钥获取 Service:API的服务名,参考对应的API文档 bodyString:API请求参数,参考对应的API文档,注意不包含公共参数...'X-TC-Action': '', 'X-TC-Version': '', 'X-TC-Region': '', }; 这里是API调用时的输入参数,不包含公共参数...地域列表具体内容可以在公共参数页面找到 公共参数文档:链接 整理信息编写函数 根据上面的文档,我们可以得出如下内容 假设我们需要获取广州的轻量应用服务器可用区列表 注:OrderField和Order为可选参数(也就是不传也可以

    54771

    JWT在Node.js中的最佳实践

    头部(Header)包含令牌的类型(JWT)以及所使用的签名算法(如HMAC SHA256或RSA等)。例如,一个简单的头部可能是“{ "alg": "HS256", "typ": "JWT" }”。...例如,使用HMAC SHA256算法时,签名是根据头部、载荷和密钥计算得出的一个字符串。JWT在许多Web应用场景中都有着重要的用途。其中,身份验证是最常见的应用场景之一。...二、JWT在Node.js中的实现步骤1. 安装必要的包在Node.js项目中,我们可以使用“jsonwebtoken”来处理JWT的相关操作,如生成和验证JWT。...如果匹配,则继续下面的操作。3. JWT的生成与验证生成JWT:当用户成功登录后,我们需要生成一个JWT。...HMAC SHA256是一种对称加密算法,它需要共享的密钥。这种算法简单高效,但存在密钥共享的风险。如果密钥泄露,攻击者就可以伪造JWT。

    10900

    HarmonyOS 开发实践——基于@ohoscrypto-js实现加解密工具箱

    @ohos/crypto-js简介@ohos/crypto-js是一个根据crypto-js库移植的 鸿蒙 三方库,适配源库4.2.0版本,提供了一系列加密算法和安全工具,主要用于执行各种消息摘要计算和对称加解密操作...// HMAC加密,使用SHA256算法let hmacSHA256Output = CryptoJS.HmacSHA256("Message", "Secret Passphrase").toString...()分段加密(以SHA-256为例)调用 CryptoJS.algo.HMAC.create接口,配置HasherStatic对象和密钥创建HMAC对象,HasherStatic可以使用crypto-js...// 创建HMAC算法实例,配置SHA256 HasherStatic对象和密钥let hmacSHA256 = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256...当不传入模式、填充、偏移量时,会默认使用CBC加密模式、Pkcs7填充方式和一个随机生成的偏移量。ECB模式不需要偏移量。

    14620

    Hmac加密方式解析

    使用HMAC算法前,我们使用createHmac方法创建一个hmac对象,创建方法如下所示: crypto.createHmac(params, key); 该方法中使用两个参数,第一个参数含义是在Node.js...中使用的算法,比如'sha1', 'md5', 'sha256', 'sha512'等等,该方法返回的是hmac对象。...最后一步就是 使用hmac对象的digest方法来输出摘要内容了;在使用hmac对象的digest方法后,不能再向hmac对象中追加摘要内容,也就是说你使用了digest方法作为输出后,因此是不能向hmac...如下使用一个简单的demo: const crypto = require('crypto'); // 创建一个hmac对象 const hmac = crypto.createHmac('md5',...'abc'); // 往hmac对象中添加摘要内容 const up = hmac.update('123456'); // 使用 digest 方法输出摘要内容 const result =

    2.2K50

    go-dongle 0.2.7 版本发布,一个轻量级、语义化的 golang 编码解码、加密解密库

    dongle.openssl.RSA.GenPKCS8KeyPair() 方法,生成 PKCS#8 格式 RSA 密钥对新增 dongle.openssl.RSA.VerifyKeyPair() 方法,验证 RSA 密钥对是否匹配新增...Base100 编码、解码Morse(摩斯) 编码、解码Md2 加密Md4 加密Md5 加密Sha1 加密Sha3-224 加密Sha3-256 加密Sha3-384 加密Sha3-512 加密Sha224 加密Sha256...加密Hmac-md4 加密Hmac-md5 加密Hmac-sha1 加密Hmac-sha3-224 加密Hmac-sha3-256 加密Hmac-sha3-384 加密Hmac-sha3-512 加密...Hmac-sha224 加密Hmac-sha256 加密Hmac-sha384 加密Hmac-sha512 加密Hmac-sha512-224 加密Hmac-sha512-256 加密Hmac-ripemd160...加密Hmac-sm3 加密Rc2 加密、解密Rc4 加密、解密Rc5 加密、解密Rc6 加密、解密Tea 加密、解密Xtea 加密、解密Aes 加密、解密Blowfish 加密、解密Des 加密、解密

    63820
    领券