HarmonyOS 鸿蒙Next RSA签名验签无法通过

发布于 1周前 作者 htzhanglong 来自 鸿蒙OS

HarmonyOS 鸿蒙Next RSA签名验签无法通过

在鸿蒙中,验签无法通过,代码如下:

export async function checkSign(plainText: Uint8Array, signMessage: Uint8Array): Promise<boolean> {
  let verifyAlg = "RSA2048|PKCS1|SHA256";
  let verifier = crypto.createVerify(verifyAlg);
  await verifier.init(await getPublicKey());
  let textSplitLen = 64; // 自定义的数据拆分长度,此处取64
  for (let i = 0; i < plainText.length; i += textSplitLen) {
    let updateMessage = plainText.subarray(i, i + textSplitLen);
    let updateMessageBlob: crypto.DataBlob = { data: updateMessage };
    // 分段update
    await verifier.update(updateMessageBlob);
  }
  // 已通过分段传入所有明文,故此处verify第一个参数传入null
  let res = await verifier.verify(null, { data: signMessage });
  console.info("verify result is " + res);
  return res;
}

更多关于HarmonyOS 鸿蒙Next RSA签名验签无法通过的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

传入的公钥是base64编码的,需要转换为Uint8Array,然后包装为DataBlob类型。 参考示例代码如下:

async function verifyMessagBySegment(pubKey: cryptoFramework.PubKey, plainText: Uint8Array, signMessageBlob: cryptoFramework.DataBlob) {
  let verifyAlg = "RSA2048|PKCS1|SHA256";
  let verifier = cryptoFramework.createVerify(verifyAlg);
  await verifier.init(pubKey);
  let textSplitLen = 64; // 自定义的数据拆分长度,此处取64
  for (let i = 0; i < plainText.length; i += textSplitLen) {
    let updateMessage = plainText.subarray(i, i + textSplitLen);
    let updateMessageBlob: cryptoFramework.DataBlob = { data: updateMessage };
    // 分段update
    await verifier.update(updateMessageBlob);
  }
  // 已通过分段传入所有明文,故此处verify第一个参数传入null
  let res = await verifier.verify(null, signMessageBlob);
  console.info("verify result is " + res);
  return res;
}

async function rsaSignatureBySegment() {
  let message = "客户端请求报文验签失败!checkVersion";
  let pubKeyStr = "";
  // 初始化Base64工具实例
  let base64Helper = new util.Base64Helper();
  // 公钥转换为Uint8Array,然后包装为DataBlob类型
  let pubKeyBlob: cryptoFramework.DataBlob = { data: base64Helper.decodeSync(pubKeyStr) };
  let keyGenAlg = "RSA2048";
  let generator = cryptoFramework.createAsyKeyGenerator(keyGenAlg);
  // 将公钥包装数据pubKeyBlob转换成密钥对类型KeyPair
  let keyPair = await generator.convertKey(pubKeyBlob, null);
  let messageData = new Uint8Array(buffer.from(message, 'utf-8').buffer);
  let s='xxx'

  let signData: cryptoFramework.DataBlob = { data: base64Helper.decodeSync(s) };
  let verifyResult = await verifyMessagBySegment(keyPair.pubKey, messageData, signData);
  if (verifyResult == true) {
    console.info('verify success');
  } else {
    console.error('verify failed');
  }
}

更多关于HarmonyOS 鸿蒙Next RSA签名验签无法通过的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对HarmonyOS(鸿蒙)Next RSA签名验签无法通过的问题,以下是一些可能的解决方案:

  1. 检查密钥对

    • 确保使用的公钥和私钥是正确匹配的。
    • 检查密钥是否损坏或格式不正确。
  2. 验证算法和填充模式

    • 确认签名和验签时使用的算法(如RSA/SHA-256)和填充模式(如PKCS#1)是否一致。
  3. 检查数据完整性

    • 确保待签名的数据在签名和验签过程中保持一致,未发生任何修改。
  4. 更新鸿蒙系统

    • 检查并更新鸿蒙系统到最新版本,以确保所有安全组件和算法库都是最新的。
  5. 检查API使用

    • 确认使用的鸿蒙API是否正确,参数是否传递正确。
    • 查阅鸿蒙官方文档,确保API的使用符合规范。
  6. 调试和日志

    • 开启详细的日志记录,检查签名和验签过程中的错误信息和异常。
    • 使用调试工具逐步跟踪代码,查找问题所在。

如果经过上述步骤后问题依旧无法解决,请联系官网客服。官网地址是:https://www.itying.com/category-93-b0.html

回到顶部