HarmonyOS鸿蒙Next中应用设备状态检测生成鉴权令牌的签名如何用arkTS实现?在签名的这一步报错了

HarmonyOS鸿蒙Next中应用设备状态检测生成鉴权令牌的签名如何用arkTS实现?在签名的这一步报错了 请问在应用设备状态检测这块功能里,生成鉴权令牌中的签名该如何用arkTS实现  在签名的这一步报错了 ,如图:

cke_560.png


更多关于HarmonyOS鸿蒙Next中应用设备状态检测生成鉴权令牌的签名如何用arkTS实现?在签名的这一步报错了的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

【背景知识】

基于服务账号生成鉴权令牌:使用应用设备状态检测服务时需要配置此章节。

【解决方案】

将完成BASE64编码后的Header字符串与Payload字符串,通过“.”进行连接,并在开发者的应用中,通过服务账号密钥文件中的private_key(华为不进行存储,请您妥善保管),使用SHA256withRSA/PSS算法对拼接的字符串签名,最后将Header,Payload以及字符串签名通过“.”进行连接,即可得到Token数据。

import { cryptoFramework } from '@kit.CryptoArchitectureKit';
import { buffer, util  } from '@kit.ArkTS';

let base64 = new util.Base64Helper();

// 生成header
function genHeader(keyId: string) : string {
  const jwtHeader: object = new Object({
    'kid': keyId,
    "typ": "JWT",
    "alg": "PS256"
  })
  let strArray = new Uint8Array(buffer.from(JSON.stringify(jwtHeader)).buffer)
  return base64.encodeToStringSync(strArray, util.Type.BASIC_URL_SAFE)
}

// 生成payload
function genPayload(subAccount: string): string {
  const now: number = Date.now()
  const jwtPayload: object = new Object({
    "aud": "***",
    'iss': subAccount,
    'iat': now,
    'exp': now + 3600,
  })
  let strArray = new Uint8Array(buffer.from(JSON.stringify(jwtPayload)).buffer)
  return base64.encodeToStringSync(strArray, util.Type.BASIC_URL_SAFE)
}

async function pss(priKey: string, str: string) {
  let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('RSA2048');
  let keyPair = asyKeyGenerator.convertPemKeySync(null, priKey)

  let signer = cryptoFramework.createSign('RSA2048|PSS|SHA256|MGF1_SHA256');
  await signer.init(keyPair.priKey);
  let signData = await signer.sign({ data : new Uint8Array(buffer.from(str).buffer)});
  return signData.data
}

export async function main() {
  // 服务账号密钥
  const privateJson: object = new Object({
    "key_id": "***",
    "private_key": "***",
    "sub_account": "***",
    "auth_uri": "***",
    "token_uri": "***",
    "auth_provider_cert_uri": "***",
    "client_cert_uri": "***"
  })
  let header = genHeader(privateJson['key_id']);
  let payload = genPayload(privateJson['sub_account']);
  let hap = header + '.' + payload
  let signature = await pss(privateJson['private_key'], hap)
  let token = hap + '.' + base64.encodeToStringSync(signature, util.Type.BASIC_URL_SAFE)
  console.info(token)
}

更多关于HarmonyOS鸿蒙Next中应用设备状态检测生成鉴权令牌的签名如何用arkTS实现?在签名的这一步报错了的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在鸿蒙Next中,使用ArkTS实现应用设备状态检测生成鉴权令牌签名时,需导入@ohos.security.huks模块。首先通过huks.generateKeyItem(keyAlias, options)生成非对称密钥对,其中options需指定HuksKeyAlg.HUKS_ALG_RSA或对应算法。然后调用huks.initSession(keyAlias, options)初始化签名会话,传入包含HuksKeyDigest.HUKS_DIGEST_SHA256等摘要算法的参数。最后使用huks.finishSession(handle, options)完成签名操作。报错通常因密钥参数不匹配或数据格式错误导致,需检查HuksParam中算法、填充模式等是否一致。

在HarmonyOS Next中使用ArkTS实现设备状态检测的签名生成时,常见问题通常集中在参数格式、编码方式或加密算法实现上。根据错误提示,建议按以下步骤排查:

  1. 检查参数拼接规范
    确保参与签名的参数(如timestamp、nonce等)按字典序排序后使用&连接,格式应为key1=value1&key2=value2

  2. 验证加密算法
    使用[@ohos](/user/ohos).cryptoJs的HMAC-SHA256算法时,确认密钥与数据格式匹配:

    import cryptoJs from '[@ohos](/user/ohos)/cryptoJs';
    
    const signature = cryptoJs.HmacSHA256(待签名字符串, 密钥).toString(cryptoJs.enc.Base64);
    
  3. 排查特殊字符处理

    • 对参数值进行URL编码(使用encodeURIComponent
    • 避免Base64编码出现换行符,可替换/[\r\n]+/g为空字符串
  4. 检查时间戳同步
    设备与服务器时间差需在允许范围内(通常±5分钟),可使用new Date().getTime()获取毫秒级时间戳

典型实现示例:

import cryptoJs from '[@ohos](/user/ohos)/cryptoJs';

function generateSign(params: Record<string, string>, secret: string): string {
  const sortedKeys = Object.keys(params).sort();
  const signString = sortedKeys.map(key => `${key}=${params[key]}`).join('&');
  return cryptoJs.HmacSHA256(signString, secret).toString(cryptoJs.enc.Base64);
}

若仍报错,请提供具体的错误信息或日志片段以便进一步分析。

回到顶部