服务热线:028-83391220 (周一~周六/9:00~18:00)在线联系
当前位置:成都途盛科技> ArkTS调用鸿蒙加密算法库框架经验

产品展示

Products

联系方式

Contact

地址:四川省成都市高新区天府大道北段28号B座2805

邮编:610000

电话:028-83391220

彭 R:13550000186

廖 R:13689009126

网址:www.cdtskj.com

ArkTS调用鸿蒙加密算法库框架经验

ArkTS调用

鸿蒙加密算法库框架经验

 

1、前言

    为实现鸿蒙原生态ArkTS与科大讯飞语音功能的调用,使用到了鸿蒙加密算法库框架,花了1天时间来踩坑,谈一点自我使用过程中的感受,以及个人结合以前开发习惯进行封装的,实现了ArkTS调用MD5算法加密,ArkTS调用HMAC-SHA256算法进行签名的实战样例。

2、总体感受

主要感受有两点:

一是鸿蒙加密算法库框架非常强大,提供了可与javax.crypto包相媲美,甚至更为强大的加密算法库框架。

二是强大的加密算法库框架,对开发人员的友好程度还比较低,入门门槛比较高。作为一个多年Java开发经验的老鸟,属于比较自信的那种,遇到了鸿蒙加密算法库框架,也花了1天时间才整明白。网上资料极少,其他菜鸟或小白估计哭晕在厕所里了。

 

鸿蒙加密算法库框架API地址:

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/js-apis-cryptoframework-0000001477981409-V3

鸿蒙加密算法库框架开发指南地址:

https://developer.harmonyos.com/cn/docs/documentation/doc-guides-V3/cryptoframework-guidelines-0000001544703861-V3

鸿蒙通用密钥库系统地址:

https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/js-apis-huks-0000001427902680-V3

 

鸿蒙提供了几乎现有流行的加密算法和通用密钥库的调用实现API。基本上能够用来解决了大多数实战中遇到的加密、签名、密钥生成验证等场景。

 

由于使用JS语言来进行编程,所以这些API的调用与Java等传统的面向过程的调用方法很大不同,使用起来也很不习惯,需要进行二次封装,方能满足程序的可读性要求和使用习惯。

 

3ArkTS调用HMAC-SHA256算法实例

目标是实现鸿蒙调用科大讯飞的语音听写流式接口,用于1分钟内的即时语音转文字技术,支持实时返回识别结果,达到一边上传音频一边获得识别文本的效果。

接口规范地址:

https://www.xfyun.cn/doc/asr/voicedictation/API.html


该接口的鉴权采用的是加密算法(仅支持hmac-sha256

 

头部引入:

import cryptoFramework from '@ohos.security.cryptoFramework';
import
util from '@ohos.util';


 

编写转换函数

/**
 *
实现字符串到Uint8Array转换
 * @param str
等转换字符串
 * @returns Uint8Array
数组对象
 */
function stringToUint8Array(str) {
 
var arr = [];
  for
(var i = 0, j = str.length; i < j; ++i) {
   
arr.push(str.charCodeAt(i));
 
}
 
var tmpArray = new Uint8Array(arr);
  return
tmpArray;
}


 

实现对鸿蒙HMAC-SHA256算法的封装,改成类似java函数同步调用的方式

/**
 * https://www.xfyun.cn/doc/asr/voicedictation/API.html
 *
按照科大讯飞要求,实现语音听写(流式版)WebAPI 文档进行接口鉴权
 *
采用通过接口密钥基于hmac-sha256计算签名
 * @param signature_origin
原始加密字段
 * @param apiSecret
私密
 * @return string
返回签名
 */
async function  HMAC_SHA256_Sign(signature_origin,apiSecret):Promise<string>
{
 
let blob = { data : stringToUint8Array(signature_origin) };//待加密字段
 
let KeyBlob = { data : stringToUint8Array(apiSecret) };//应用私密
 
let base64 = new  util.Base64Helper();
  var
mac;
  try
{
   
// 参数选择请参考上述算法支持范围
   
mac = cryptoFramework.createMac("SHA256");
 
} catch (error) {
   
console.error("[Promise]: error code: " + error.code + ", message is: " + error.message);
 
}
 
var symKeyGenerator = cryptoFramework.createSymKeyGenerator("AES256");
  const
result = await new Promise((resolve) => {
   
symKeyGenerator.convertKey(KeyBlob, (err, symKey) => {
     
if (err) {
        
console.error("[Callback] err: " + err.code);
     
}
     
mac.init(symKey, (err1,) => {
       
if (err1) {
         
console.error("[Callback] err: " + err1.code);
       
}
       
mac.update(blob, (err2,) => {
         
if (err2) {
           
console.error("[Callback] err: " + err2.code);
         
}
         
mac.doFinal((err3, macOutput) => {
           
if (err3) {
             
console.error("[Callback] err: " + err3.code);
           
} else {
             
console.info("[Promise]: HMAC result: " + macOutput);
             
resolve(base64.encodeToStringSync(macOutput.data));
           
}
          }
);
       
});
     
});
   
});
 
});
  return
result.toString();
}


 

方法调用

const result: string = await HMAC_SHA256_Sign(signature_origin,this.apiSecret);


 

4ArkTS调用MD5加密算法实例

目标是实现鸿蒙调用科大讯飞的语音转写接口。

接口规范地址:

https://www.xfyun.cn/doc/asr/ifasr_new/API.html


 

实现的方法体:


/**
 * https://www.xfyun.cn/doc/asr/ifasr_new/API.html
 *
按照科大讯飞要求,实现语音转写 API 文档进行接口鉴权
 *
获取baseString,baseString appid 和当前时间戳 ts 拼接而成;
 *
baseString 进行 MD5
 *
secret key key MD5 之后的 baseString 进行 HmacSHA1 加密,然后再对加密后的字符串进行 base64 编码。
 *
 *
实现MD5加密后,再采用通过接口密钥基于hmac-sha1计算签名
 * @param signature_origin
原始加密字段===baseString appid 和当前时间戳 ts 拼接而成;
 * @param apiSecret
私密
 * @return string
返回签名
 */
async function  MD5_HMAC_SHA1_Sign(signature_origin,apiSecret):Promise<string>
{
 
let blob = { data : stringToUint8Array(signature_origin) };//待加密字段
 
let KeyBlob = { data : stringToUint8Array(apiSecret) };//应用私密
 
let base64 = new  util.Base64Helper();
  var
md;
  try
{
   
// 参数选择请参考上述算法支持范围
   
md = cryptoFramework.createMd("MD5");
 
} catch (error) {
   
console.error("[Promise]: error code: " + error.code + ", message is: " + error.message);
 
}
 
//对原始加密字段进行MD5加密-----------------------------------
  
const md5_result = await new Promise((resolve) => {
   
md.update(blob, (err,) => {
     
if (err) {
       
console.error("[Callback] err: " + err.code);
     
}
    }
);
   
md.digest((err1, mdOutput) => {
     
if (err1) {
       
console.error("[Callback] err: " + err1.code);
     
} else {
       
console.info("[Callback]: MD result: " + mdOutput);
       
//取得加密后字符串
       
resolve(mdOutput);
     
}
    }
);
 
});
 
//--------------------------------------------------

  //----------
MD5 之后的 baseString 进行 HmacSHA1 加密------------------------------------------
 
var mac;
  try
{
   
// 参数选择请参考上述算法支持范围
   
mac = cryptoFramework.createMac("SHA1");
 
} catch (error) {
   
console.error("[Promise]: error code: " + error.code + ", message is: " + error.message);
 
}
 
var symKeyGenerator = cryptoFramework.createSymKeyGenerator("AES256");
  const
result = await new Promise((resolve) => {
   
symKeyGenerator.convertKey(KeyBlob, (err, symKey) => {
     
if (err) {
       
console.error("[Callback] err: " + err.code);
     
}
     
mac.init(symKey, (err1,) => {
       
if (err1) {
         
console.error("[Callback] err: " + err1.code);
       
}
       
mac.update(md5_result, (err2,) => {
         
if (err2) {
           
console.error("[Callback] err: " + err2.code);
         
}
         
mac.doFinal((err3, macOutput) => {
           
if (err3) {
             
console.error("[Callback] err: " + err3.code);
           
} else {
             
console.info("[Promise]: HMAC result: " + macOutput);
              
//对结果进行BASE64加密
             
resolve(base64.encodeToStringSync(macOutput.data));
           
}
          }
);
       
});
     
});
   
});
 
});
 
//------------------------------------------------------------------------------------
 
return  result.toString();

}


方法调用同上例。

 

 


Back to Top
点击这里给我发消息
Back to Bottom
版权所有:2015 成都途盛科技有限公司 首页 | 公司介绍 | 产品介绍 | 解决方案 | 新闻资料 | 意见反馈 | 联系我们 | 备案号:蜀ICP备14005567号-1