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
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实现。