HarmonyOS 鸿蒙Next 如何使用HMAC-SHA256算法和已知密钥对一个签名字符串进行加密

HarmonyOS 鸿蒙Next 如何使用HMAC-SHA256算法和已知密钥对一个签名字符串进行加密

一些Websocket服务需要在url中拼接加密后的鉴权信息,JS的库可以很方方便的完成对签名字符串的加密,在鸿蒙中该怎么做呢? 我有一个noteJS的函数,它的主要功能是将一些信息通过一系列的加密操作最终生成一个Base64的加密字符串,用作鉴权使用, 该方法如下:

function getAuthStr(date) {
  // 1. 构造签名字符串 
  let signatureOrigin = `host: ${config.host}\ndate: ${date}\nGET ${config.uri} HTTP/1.1`;
  // 2. 使用HMAC-SHA256算法对签名字符串进行加密,生成SHA256哈希值 
  //  config.apiSecret: 为三方平台提供的私钥,以string的方式提供 
  let signatureSha = CryptoJS.HmacSHA256(signatureOrigin, config.apiSecret);
  // 3. 将哈希值转换为Base64编码的字符串 
  let signature = CryptoJS.enc.Base64.stringify(signatureSha);
  // 4. 构造授权头的原始字符串 
  let authorizationOrigin =
    `api_key="${config.apiKey}", algorithm="hmac-sha256", headers="host date request-line", signature="${signature}"`;
  // 5. 将授权头的原始字符串转换为Base64编码的字符串 
  let authStr = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(authorizationOrigin));
  // 6. 返回最终的授权字符串 
  return authStr;
}

其中第2步和第5步如果使用鸿蒙的API,该怎么做呢?


更多关于HarmonyOS 鸿蒙Next 如何使用HMAC-SHA256算法和已知密钥对一个签名字符串进行加密的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

使用HMAC-SHA256算法对签名字符串进行加密,生成SHA256哈希值

import { cryptoFramework } from '@kit.CryptoArchitectureKit';

import { buffer } from '@kit.ArkTS';

import { util } from '@kit.ArkTS';

@Entry
@Component
struct SMACCrypto {
  @State message: string = '点击开始';

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            doHmacBySync()
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}

function genSymKeyByData(symKeyData: Uint8Array) {
  let symKeyBlob: cryptoFramework.DataBlob = { data: symKeyData };
  let aesGenerator = cryptoFramework.createSymKeyGenerator('AES128');
  let symKey = aesGenerator.convertKeySync(symKeyBlob);
  console.info('[Sync]convertKey success');
  return symKey;
}

function doHmacBySync() {
  // 把字符串按utf-8解码为Uint8Array,使用固定的128位的密钥,即16字节
  let keyData = new Uint8Array(buffer.from("12345678abcdefgh", 'utf-8').buffer);
  let key = genSymKeyByData(keyData);
  let macAlgName = 'SHA256'; // 摘要算法名
  let message = 'hmacTestMessgae'; // 待进行HMAC的数据
  let mac = cryptoFramework.createMac(macAlgName);
  mac.initSync(key);
  // 数据量较少时,可以只做一次update,将数据全部传入,接口未对入参长度做限制
  mac.updateSync({ data: new Uint8Array(buffer.from(message, 'utf-8').buffer) });
  let macResult = mac.doFinalSync();
  console.info('[Sync]HMAC result:' + macResult.data);
  let macLen = mac.getMacLength();
  console.info('HMAC len:' + macLen);
}

5)将授权头的原始字符串转换为Base64编码的字符串

let str = "原始字符"
let U8A = new Uint8Array(buffer.from(str , 'utf-8').buffer)
let base64 = new util.Base64Helper();
let base64str = base64.encodeToStringSync(new Uint8Array(U8A ))

更多关于HarmonyOS 鸿蒙Next 如何使用HMAC-SHA256算法和已知密钥对一个签名字符串进行加密的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS(鸿蒙)系统中,若要使用HMAC-SHA256算法和已知密钥对一个签名字符串进行加密(实际是生成HMAC值,因为HMAC不是加密而是一种消息认证码),可以通过以下步骤实现,这里假设你使用的是鸿蒙的Native开发环境或者支持C++的开发环境(由于要求不涉及Java和C语言的具体代码,以下描述较为抽象):

  1. 引入必要的库:确保你的项目包含了支持HMAC-SHA256的库。在鸿蒙系统中,你可能需要查找相关的系统库或者第三方库。

  2. 准备密钥和消息:将你的已知密钥和待签名的字符串准备好,通常密钥需要进行适当的编码处理。

  3. 调用HMAC-SHA256函数:使用鸿蒙提供的API或者库函数,传入密钥、消息和HMAC-SHA256作为参数,调用生成HMAC值的函数。

  4. 获取结果:函数执行后会返回生成的HMAC值,这个值通常是一个固定长度的字节数组。

  5. 处理结果:你可以将生成的HMAC值进行编码(如Base64)以便于存储或传输。

如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html

回到顶部