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

一些Websocket服务需要在url中拼接加密后的鉴权信息,JS的库可以很方方便的完成对签名字符串的加密,在HarmonyOS中该怎么做呢?

我有一个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;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.

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

HarmonyOS
2024-12-25 08:43:48
浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
shlp

使用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);
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.

将授权头的原始字符串转换为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 ))
  • 1.
  • 2.
  • 3.
  • 4.
分享
微博
QQ
微信
回复
2024-12-25 11:30:33


相关问题
HarmonyOS 字符串进行SHA1编码
616浏览 • 1回复 待解决
HarmonyOS 字符串进行md5加密的demo
627浏览 • 1回复 待解决
HarmonyOS string字符串sha1加密方法
742浏览 • 1回复 待解决
怎么动态组装一个json字符串
956浏览 • 1回复 待解决
如何字符串进行MD5哈希处理
3537浏览 • 1回复 待解决
如何快速将一个Map对象转为Json字符串
1569浏览 • 1回复 待解决
HarmonyOS 加密字符串格式转换
856浏览 • 1回复 待解决
HarmonyOS字符串SHA-1开发问题
1164浏览 • 1回复 待解决