首页 > 其他分享 >【harmonyOS】TOTP 实现

【harmonyOS】TOTP 实现

时间:2024-03-12 19:00:33浏览次数:24  
标签:cryptoFramework 实现 await util harmonyOS TOTP let import data

鸿蒙TOTP 实现:

import cryptoFramework from '@ohos.security.cryptoFramework';
import { util } from '@kit.ArkTS';

export class HmacSHA1{

  static async hmacSHA1(data: string, secret: string): Promise<Uint8Array> {
    let mac = cryptoFramework.createMac("SHA1")
    let key_data = new util.TextEncoder().encodeInto(secret);
    let symKey = await cryptoFramework.createSymKeyGenerator("HMAC").convertKey({ data: key_data })
    await mac.init(symKey)
    await mac.update({ data: new util.Base64Helper().decodeSync(data)})
    let result = await mac.doFinal()
    return result.data
  }
}
import { buffer, util } from '@kit.ArkTS';
import { HmacSHA1 } from './HmacSHA1';
import { hilog } from '@kit.PerformanceAnalysisKit';

const TAG = '[TotpGenerator]';

export class TotpGenerator{
  //步长 1800 s
  private static STEP:number = 1800;
  // totp code 长度 8, 如果需要六位,可以改成 6
  private static TOTP_SIZE:number = 8;

  static async generate(key:string): Promise<string>{
    let t = Date.now() / 1000 / TotpGenerator.STEP;
    try {
      let buff = buffer.alloc(8);
      buff.writeBigInt64BE(BigInt(Math.floor(t)));
      let data:Uint8Array = new Uint8Array(buff.buffer);
      const hmacData = await HmacSHA1.hmacSHA1(new util.Base64Helper().encodeToStringSync(data),key);
      const offset = hmacData[hmacData.length - 1] & 0x0f;
      const binCode = (hmacData[offset] & 0x7f) << 24
        | (hmacData[offset + 1] & 0xff) << 16
        | (hmacData[offset + 2] & 0xff) << 8
        | (hmacData[offset + 3] & 0xff);

      const code = String(binCode);
      const startIndex = ((code.length - TotpGenerator.TOTP_SIZE) < 0) ? 0 : (code.length - TotpGenerator.TOTP_SIZE);
      return code.substring(startIndex);
    } catch (e) {
      hilog.warn(0x0000, TAG, '%{public}s', "generate error:" + e);
    }
    return ""
  }
}

标签:cryptoFramework,实现,await,util,harmonyOS,TOTP,let,import,data
From: https://www.cnblogs.com/qiyer/p/18069010

相关文章

  • 第143篇:手写vue-router,实现router-view
    好家伙, 今天来手写我们的老伙计vue-router, 1.替换router新开一个项目,并使用我们手写的router 2.大致结构letVue;//保存vue的构造函数classVueRouter{constructor(options){}}VueRouter.install=(_Vue)=>{Vue=_Vue;//备......
  • js 实现点击下拉滚动
    在JavaScript中实现点击下拉菜单后滚动到特定位置,通常用于导航栏的下拉菜单或对话框内容的自动滚动等场景。以下是一个简单的示例:假设我们有一个HTML结构,包含一个可点击的元素(如按钮)和一个需要滚动的下拉列表:<buttonid="dropdown-toggle">点击打开下拉菜单</button><div......
  • 单例模式的几种实现方式
    单例模式的实现有多种方式,如下所示:1、懒汉式,线程不安全是否Lazy初始化:是是否多线程安全:否实现难度:易描述:这种方式是最基本的实现方式,这种实现最大的问题就是不支持多线程。因为没有加锁synchronized,所以严格意义上它并不算单例模式。这种方式lazyloading很明显,不要......
  • 扩展卡尔曼滤波器的粒子实现
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录1.扩展卡尔曼滤波器的粒子实现2.粒子的特征3.粒子提取及其维度3.1提取粒子3.2粒子携带的信息3.3粒子的维度4.重要性密度函数声明:以下为作者自己学习整理的内容,分享出来只......
  • R语言扩展包与MaxEnt模型的集成:实现高效的物种分布模拟
    在生态学研究中,物种分布模拟是一项至关重要的任务。它有助于我们理解物种与环境之间的复杂关系,预测物种在气候变化或人类活动影响下的潜在分布变化。近年来,随着计算机技术的不断发展,基于机器学习的物种分布模拟方法逐渐成为研究热点。其中,MaxEnt模型作为一种广泛应用的物种......
  • 使用 PMML 实现模型融合及优化技巧
    在机器学习的生产环境中,我们经常需要将多个模型的预测结果进行融合,以便提高预测的准确性。这个过程通常涉及到多个模型子分的简单逻辑回归融合。虽然离线训练时我们可以直接使用sklearn的逻辑回归进行训练和调参,但在生产环境中,模型的上线往往需要使用PMML(PredictiveModelMarkup......
  • Android RecyclerView的使用(以实现一个简单的动态聊天界面为例)
    RecycleView可以实现动态列表的功能,毕竟在实际开发中大多数情况下不可能提前知道一个列表要塞进去多少东西。比如说QQ微信的聊天栏界面,可以抽象成一个RecycleView(或者一个ListView),没人说话时列表为空,你发一句话我发一句话,这列表就长起来了。再或者像是一些管理系统里,每一个物品......
  • java8中,Arrays.sort()默认是升序的,对于基本数据类型,使其降序怎么实现
    对于引用数据类型,自定义比较器对象,实现Comparator接口/Comparable接口对于基本数据类型,自定义比较器对象,将基本数据类型转换成对应的包装类型即可但是这样写是错误的,importjava.util.Arrays;importjava.util.Comparator;publicclassSortExample{publicstatic......
  • 【CentOS】Linux 或 Windows 上实现端口映射
    一、什么端口映射?端口映射:端口映射就是将内网中的主机的一个端口映射到外网主机的一个端口,提供相应的服务。当用户访问外网IP的这个端口时,服务器自动将请求映射到对应局域网内部的机器上。我们在内网中有一台Web服务器,但是外网中的用户是没有办法直接访问该服务器的。于是我们可......
  • Spring的核心思想之一IOC:仿Spring自定义一个实现IOC的容器
    IoCInversionofControl(控制反转/反转控制),是⼀个技术思想而不是⼀个技术实现。它描述的是Java开发领域对象的创建,管理的问题——传统开发⽅式:⽐如类A依赖于类B,往往会在类A中new⼀个B的对象,而在IoC思想下开发⽅式:使用者不⽤⾃⼰去new对象了,由IoC容器(Spring框架或其他)帮......