HarmonyOS 鸿蒙Next中JWT签名代码

HarmonyOS 鸿蒙Next中JWT签名代码 尝试使用@kit.CryptoArchitectureKit去实现JWT的PS256签名,发现生成的签名无法验证,改用RS256签名就能验证,请问如何解决。

使用PS256签名的部分代码(验证失败):

// Create signer with PS256 (RSA-PSS with SHA-256)
const signer = cryptoFramework.createSign('RSA2048|PSS|SHA256|MGF1_SHA256');

// Initialize signer with private key
await signer.init(keyPair.priKey);

// Sign the data
const signData: cryptoFramework.DataBlob = { data: dataBuffer };
const signature = await signer.sign(signData);

// Convert signature to base64url
return this.base64UrlEncode(signature.data);

使用RS256签名的部分代码(验证成功):

const signer = cryptoFramework.createSign('RSA2048|PKCS1|SHA256');

// Initialize signer with private key
await signer.init(keyPair.priKey);

// Sign the data
const signData: cryptoFramework.DataBlob = { data: dataBuffer };
const signature = await signer.sign(signData);

// Convert signature to base64url
return this.base64UrlEncode(signature.data);

请问是库使用的不正确吗?


更多关于HarmonyOS 鸿蒙Next中JWT签名代码的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

PS256 是 RSA-PSS 签名方案与 SHA-256 的组合,其参数需显式配置。验签时需使用与签名完全相同的参数。若验签端未同步配置 PSS 参数,验证将失败。另外RSA 密钥对在生成时需确保支持 PSS 模式。若密钥对生成方式不兼容 PSS,签名可能无效。

解决方案

第一步:在签名时设置盐长度、MGF1 哈希算法等参数,确保与验签端一致:

// 创建 Sign 实例时指定算法

const signer = cryptoFramework.createSign('RSA2048|PSS|SHA256|MGF1_SHA256');

// 设置盐长度(例如设为 SHA-256 摘要长度 32 字节)

await signer.setSignSpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM, 32);

// 初始化并签名

await signer.init(keyPair.priKey);

const signature = await signer.sign(signData);

第二部:验签时需配置相同的盐长度与 MGF1 算法:

// 创建 Verify 实例时指定相同算法

const verifyer = cryptoFramework.createVerify('RSA2048|PSS|SHA256|MGF1_SHA256');

// 设置相同的盐长度

await verifyer.setVerifySpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM, 32);

// 初始化并验签

await verifyer.init(keyPair.pubKey);

const verifyResult = await verifyer.verify(signData, signature);

第三步:确保生成 RSA 密钥对时支持 PSS 模式比如:

// 生成 RSA 密钥对参数

const rsaParams: cryptoFramework.RSAKeyGenParams = {

  algName: 'RSA',

  specType: cryptoFramework.AsyKeySpecType.RSA_SPEC,

  params: {

    n: 2048, // 密钥长度

    alg: 'RSA|PSS', // 明确支持 PSS

  },

};

// 生成密钥对

const keyGen = cryptoFramework.createAsyKeyGeneratorBySpec(rsaParams);

const keyPair = await keyGen.generateKeyPair();

更多关于HarmonyOS 鸿蒙Next中JWT签名代码的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


盐值长度不匹配:PS256签名要求显式设置PSS盐值长度(默认可能使用最大长度),而验证方可能使用固定盐值策略。根据文档,鸿蒙加解密库使用PSS模式时必须通过setSignSpec指定PSS_SALT_LEN_NUM参数。

算法参数未对齐:PSS模式需要签名/验签双方严格保持盐值长度、掩码算法等参数一致,而RS256使用的PKCS1模式无需处理这些参数。

设置盐值长度

// 添加签名参数配置
import { cryptoFramework } from '@kit.CryptoArchitectureKit';

// 签名前设置盐值长度(需与验签方协商一致)
let signSpec: cryptoFramework.SignSpec = {
  algName: 'RSA',
  specType: cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM,
  value: 32 // SHA256摘要长度32字节,推荐盐值等同摘要长度
};
await signer.setSignSpec(signSpec);

检查密钥生成方式

// 生成密钥时需明确指定PSS参数
const keyGen = cryptoFramework.createAsyKeyGenerator('RSA2048|PSS|SHA256|MGF1_SHA256');
const keyPair = await keyGen.generateKeyPair();

验证端参数同步

验签代码需保持完全一致的算法参数

// 验签方应同步设置盐值长度
const verifier = cryptoFramework.createVerify('RSA2048|PSS|SHA256|MGF1_SHA256');
let verifySpec: cryptoFramework.VerifySpec = {
  algName: 'RSA',
  specType: cryptoFramework.VerifySpecItem.PSS_SALT_LEN_NUM,
  value: 32 // 必须与签名方相同
};
await verifier.setVerifySpec(verifySpec);

在HarmonyOS Next中,JWT签名可使用ArkTS实现。需导入@hwjwt模块,调用sign方法,指定算法(如HS256)、密钥及载荷数据。示例代码:

import jwt from '@hwjwt';

let payload = { sub: '1234567890', name: 'John Doe' };
let secret = 'your-secret-key';
let token = jwt.sign(payload, secret, { algorithm: 'HS256' });

注意处理异步操作及错误。

问题可能出在PSS签名参数配置上。PS256签名需要正确设置盐值长度,而默认参数可能与验证端不匹配。建议检查验证端使用的PSS参数(特别是盐值长度),确保签名和验证时使用相同配置。可以尝试在createSign时显式指定盐值长度参数,或确认两端使用兼容的PSS实现。

回到顶部