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;
}

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

HarmonyOS
1天前
浏览
收藏 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);
}

将授权头的原始字符串转换为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 ))
分享
微博
QQ
微信
回复
21h前
相关问题
怎么动态组装一个json字符串
291浏览 • 1回复 待解决
如何字符串进行MD5哈希处理
2687浏览 • 1回复 待解决
HarmonyOS字符串SHA-1开发问题
448浏览 • 1回复 待解决
HarmonyOS 加密字符串格式转换
44浏览 • 1回复 待解决
关于加密字符串相关问题
229浏览 • 1回复 待解决