鸿蒙开发:Universal Keystore Kit(密钥管理服务)【密钥派生(ArkTS)】

密钥派生(ArkTS)

以HKDF256密钥为例,完成密钥派生。具体的场景介绍及支持的算法规格。

开发步骤

生成密钥

  1. 指定密钥别名。

  2. 初始化密钥属性集,可指定参数HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG(可选),用于标识基于该密钥派生出的密钥是否由HUKS管理。

    • 当TAG设置为HUKS_STORAGE_ONLY_USED_IN_HUKS时,表示基于该密钥派生出的密钥,由HUKS管理,可保证派生密钥全生命周期不出安全环境。
    • 当TAG设置为HUKS_STORAGE_KEY_EXPORT_ALLOWED时,表示基于该密钥派生出的密钥,返回给调用方管理,由业务自行保证密钥安全。
    • 若业务未设置TAG的具体值,表示基于该密钥派生出的密钥,即可由HUKS管理,也可返回给调用方管理,业务可在后续派生时再选择使用何种方式保护密钥。
    • 开发前请熟悉鸿蒙开发指导文档gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。
  3. 调用[generateKeyItem]生成密钥,具体请参考[密钥生成]。

除此之外,开发者也可以参考[密钥导入],导入已有的密钥。

密钥派生

  1. 获取密钥别名、指定对应的属性参数HuksOptions。

    可指定参数HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG(可选),用于标识派生得到的密钥是否由HUKS管理。

    生成派生规格
    HUKS_STORAGE_ONLY_USED_IN_HUKSHUKS_STORAGE_ONLY_USED_IN_HUKS密钥由HUKS管理
    HUKS_STORAGE_KEY_EXPORT_ALLOWEDHUKS_STORAGE_KEY_EXPORT_ALLOWED密钥返回给调用方管理
    未指定TAG具体值HUKS_STORAGE_ONLY_USED_IN_HUKS密钥由HUKS管理
    未指定TAG具体值HUKS_STORAGE_KEY_EXPORT_ALLOWED密钥返回给调用方管理
    未指定TAG具体值未指定TAG具体值密钥返回给调用方管理

    注:派生时指定的TAG值,不可与生成时指定的TAG值冲突。表格中仅列举有效的指定方式。

  2. 调用[initSession]初始化密钥会话,并获取会话的句柄handle。

  3. 调用[updateSession]更新密钥会话。

  4. 调用[finishSession]结束密钥会话,完成派生。

在这里插入图片描述

删除密钥

当密钥废弃不用时,需要调用[deleteKeyItem]删除密钥,具体请参考[密钥删除]

/** 以下以HKDF256密钥的Promise操作使用为例*/
import { huks } from '@kit.UniversalKeystoreKit';/** 确定密钥别名和封装密钥属性参数集*/
let srcKeyAlias = "hkdf_Key";
let deriveHkdfInData = "deriveHkdfTestIndata";
let handle: number;
let finishOutData: Uint8Array;
let HuksKeyDeriveKeySize = 32;
/* 集成生成密钥参数集 */
let properties: Array<huks.HuksParam> = [{tag: huks.HuksTag.HUKS_TAG_ALGORITHM,value: huks.HuksKeyAlg.HUKS_ALG_AES,}, {tag: huks.HuksTag.HUKS_TAG_PURPOSE,value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DERIVE,
}, {tag: huks.HuksTag.HUKS_TAG_DIGEST,value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256,
}, {tag: huks.HuksTag.HUKS_TAG_KEY_SIZE,value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_128,
}, {tag: huks.HuksTag.HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG,value: huks.HuksKeyStorageType.HUKS_STORAGE_ONLY_USED_IN_HUKS,
}];let huksOptions: huks.HuksOptions = {properties: properties,inData: new Uint8Array(new Array())
}
/* 集成init时密钥参数集 */
let initProperties: Array<huks.HuksParam> = [{tag: huks.HuksTag.HUKS_TAG_ALGORITHM,value: huks.HuksKeyAlg.HUKS_ALG_HKDF,
}, {tag: huks.HuksTag.HUKS_TAG_PURPOSE,value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DERIVE,
}, {tag: huks.HuksTag.HUKS_TAG_DIGEST,value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256,
}, {tag: huks.HuksTag.HUKS_TAG_DERIVE_KEY_SIZE,value: HuksKeyDeriveKeySize,
}];let initOptions: huks.HuksOptions = {properties: initProperties,inData: new Uint8Array(new Array())
}
/* 集成finish时密钥参数集 */
let finishProperties: Array<huks.HuksParam> = [{tag: huks.HuksTag.HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG,value: huks.HuksKeyStorageType.HUKS_STORAGE_ONLY_USED_IN_HUKS,
}, {tag: huks.HuksTag.HUKS_TAG_IS_KEY_ALIAS,value: true,
}, {tag: huks.HuksTag.HUKS_TAG_ALGORITHM,value: huks.HuksKeyAlg.HUKS_ALG_AES,
}, {tag: huks.HuksTag.HUKS_TAG_KEY_SIZE,value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_256,
}, {tag: huks.HuksTag.HUKS_TAG_PURPOSE,value:huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT |huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT,
}, {tag: huks.HuksTag.HUKS_TAG_DIGEST,value: huks.HuksKeyDigest.HUKS_DIGEST_NONE,
}, {tag: huks.HuksTag.HUKS_TAG_KEY_ALIAS,value: StringToUint8Array(srcKeyAlias),
}, {tag: huks.HuksTag.HUKS_TAG_PADDING,value: huks.HuksKeyPadding.HUKS_PADDING_NONE,
}, {tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE,value: huks.HuksCipherMode.HUKS_MODE_ECB,
}];
let finishOptions: huks.HuksOptions = {properties: finishProperties,inData: new Uint8Array(new Array())
}function StringToUint8Array(str: String) {let arr: number[] = new Array();for (let i = 0, j = str.length; i < j; ++i) {arr.push(str.charCodeAt(i));}return new Uint8Array(arr);
}class throwObject {isThrow = false;
}function generateKeyItem(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: throwObject) {return new Promise<void>((resolve, reject) => {try {huks.generateKeyItem(keyAlias, huksOptions, (error, data) => {if (error) {reject(error);} else {resolve(data);}});} catch (error) {throwObject.isThrow = true;throw (error as Error);}});
}async function publicGenKeyFunc(keyAlias: string, huksOptions: huks.HuksOptions) {console.info(`enter promise generateKeyItem`);let throwObject: throwObject = { isThrow: false };try {await generateKeyItem(keyAlias, huksOptions, throwObject).then((data) => {console.info(`promise: generateKeyItem success, data = ${JSON.stringify(data)}`);}).catch((error: Error) => {if (throwObject.isThrow) {throw (error as Error);} else {console.error(`promise: generateKeyItem failed, ${JSON.stringify(error)}`);}});} catch (error) {console.error(`promise: generateKeyItem input arg invalid, ${JSON.stringify(error)}`);}
}function initSession(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: throwObject) {return new Promise<huks.HuksSessionHandle>((resolve, reject) => {try {huks.initSession(keyAlias, huksOptions, (error, data) => {if (error) {reject(error);} else {resolve(data);}});} catch (error) {throwObject.isThrow = true;throw (error as Error);}});
}async function publicInitFunc(keyAlias: string, huksOptions: huks.HuksOptions) {console.info(`enter promise doInit`);let throwObject: throwObject = { isThrow: false };try {await initSession(keyAlias, huksOptions, throwObject).then((data) => {console.info(`promise: doInit success, data = ${JSON.stringify(data)}`);handle = data.handle;}).catch((error: Error) => {if (throwObject.isThrow) {throw (error as Error);} else {console.error(`promise: doInit failed, ${JSON.stringify(error)}`);}});} catch (error) {console.error(`promise: doInit input arg invalid, ${JSON.stringify(error)}`);}
}function updateSession(handle: number, huksOptions: huks.HuksOptions, throwObject: throwObject) {return new Promise<huks.HuksOptions>((resolve, reject) => {try {huks.updateSession(handle, huksOptions, (error, data) => {if (error) {reject(error);} else {resolve(data);}});} catch (error) {throwObject.isThrow = true;throw (error as Error);}});
}async function publicUpdateFunc(handle: number, huksOptions: huks.HuksOptions) {console.info(`enter promise doUpdate`);let throwObject: throwObject = { isThrow: false };try {await updateSession(handle, huksOptions, throwObject).then((data) => {console.info(`promise: doUpdate success, data = ${JSON.stringify(data)}`);}).catch((error: Error) => {if (throwObject.isThrow) {throw (error as Error);} else {console.error(`promise: doUpdate failed, ${JSON.stringify(error)}`);}});} catch (error) {console.error(`promise: doUpdate input arg invalid, ${JSON.stringify(error)}`);}
}function finishSession(handle: number, huksOptions: huks.HuksOptions, throwObject: throwObject) {return new Promise<huks.HuksReturnResult>((resolve, reject) => {try {huks.finishSession(handle, huksOptions, (error, data) => {if (error) {reject(error);} else {resolve(data);}});} catch (error) {throwObject.isThrow = true;throw (error as Error);}});
}async function publicFinishFunc(handle: number, huksOptions: huks.HuksOptions) {console.info(`enter promise doFinish`);let throwObject: throwObject = { isThrow: false };try {await finishSession(handle, huksOptions, throwObject).then((data) => {finishOutData = data.outData as Uint8Array;console.info(`promise: doFinish success, data = ${JSON.stringify(data)}`);}).catch((error: Error) => {if (throwObject.isThrow) {throw (error as Error);} else {console.error(`promise: doFinish failed, ${JSON.stringify(error)}`);}});} catch (error) {console.error(`promise: doFinish input arg invalid, ${JSON.stringify(error)}`);}
}function deleteKeyItem(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: throwObject) {return new Promise<void>((resolve, reject) => {try {huks.deleteKeyItem(keyAlias, huksOptions, (error, data) => {if (error) {reject(error);} else {resolve(data);}});} catch (error) {throwObject.isThrow = true;throw (error as Error);}});
}async function publicDeleteKeyFunc(keyAlias: string, huksOptions: huks.HuksOptions) {console.info(`enter promise deleteKeyItem`);let throwObject: throwObject = { isThrow: false };try {await deleteKeyItem(keyAlias, huksOptions, throwObject).then((data) => {console.info(`promise: deleteKeyItem key success, data = ${JSON.stringify(data)}`);}).catch((error: Error) => {if (throwObject.isThrow) {throw (error as Error);} else {console.error(`promise: deleteKeyItem failed, ${JSON.stringify(error)}`);}});} catch (error) {console.error(`promise: deleteKeyItem input arg invalid, ${JSON.stringify(error)}`);}
}async function testDerive() {/* 生成密钥 */await publicGenKeyFunc(srcKeyAlias, huksOptions);/* 进行派生操作 */await publicInitFunc(srcKeyAlias, initOptions);initOptions.inData = StringToUint8Array(deriveHkdfInData);await publicUpdateFunc(handle, initOptions);await publicFinishFunc(handle, finishOptions);await publicDeleteKeyFunc(srcKeyAlias, huksOptions);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/44475.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电机学-绪论

绪论 电机&#xff1a;根据电磁感应定律和电磁力定律实现机电能量转换和信号传递与转换的电磁机械装置。 电磁感应定律&#xff1a; BiliBili: 法拉第电磁感应定律 BiliBili: 楞次定律 BiliBili: 左手定则、右手定则、右手螺旋定则

数据结构JAVA

1.数据结构之栈和队列 栈结构 先进后出 队列结构 先进先出 队列 2.数据结构之数组和链表 数组结构 查询快、增删慢 队列结构 查询慢、增删快 链表的每一个元素我们叫结点 每一个结点都是独立的对象

对于多个表多个字段进行查询、F12查看网页的返回数据帮助开发、数据库的各种查询方式(多对多、多表查询、子查询等)。

对于多个表多个字段进行查询、F12查看网页的返回数据帮助开发、数据库的各种查询方式&#xff08;多对多、多表查询、子查询等&#xff09;。 一、 前端界面需要展现多个表的其中几个数据的多表查询。1. 三个表查询其中字段返回&#xff1a;&#xff08;用一下sql语句&#xff…

Redis的入门导读(一)

目录 单机架构 分布式系统 个人总结 一.Redis的介绍 二.Redis特性 三.Redis的快原因 四.Redis的应用场景 五.Redis的总结 由于Redis和分布式系统息息相关&#xff0c;因此我们需要先了解一下&#xff0c;分布式系统&#xff01; 接下来就是分布式系统的演化过程。 单…

JavaScript(7)——数组

JavaScript中数组的用法与Java差不多&#xff0c;但还是有一些区别 声明数组 语法: let 数组名 [数据1,数据2,数据...] let arr new Array(数据1,数据2,...数据n) 添加数据 数组.push()方法将一个或多个元素添加到数组末尾&#xff0c;并返回该数组新长度 <script>…

机器学习(五) -- 监督学习(7) --SVM1

系列文章目录及链接 上篇&#xff1a;机器学习&#xff08;五&#xff09; -- 监督学习&#xff08;6&#xff09; --逻辑回归 下篇&#xff1a; 前言 tips&#xff1a;标题前有“***”的内容为补充内容&#xff0c;是给好奇心重的宝宝看的&#xff0c;可自行跳过。文章内容被…

如何写好品牌宣传稿提升品牌曝光?看这篇文章就够了

在这个信息爆炸的时代&#xff0c;一句精炼而富有力量的宣传语&#xff0c;足以让品牌在万千竞争者中脱颖而出。撰写一篇成功的品牌宣传稿&#xff0c;不仅是对文字艺术的驾驭&#xff0c;也是对品牌灵魂的深刻洞察与精准传达&#xff0c;更是连接品牌与消费者情感与认知的桥梁…

蚁剑编码器编写——php木马免杀

蚁剑编码器编写——php木马免杀 我的想法是 木马要先免杀&#xff0c;能够落地&#xff0c;再去考虑流量层面的问题 举几个例子演示一下 命令执行与代码执行是有比较大的区别&#xff0c;蚁剑执行的是php代码&#xff0c;而system&#xff0c;proc_open,passthru,exec,shell_…

Adobe Illustrator 2021 for mac/Win:专业矢量图形设计的巅峰之作

Adobe Illustrator 2021作为Adobe公司旗下的旗舰矢量图形设计软件&#xff0c;无论是对于Mac还是Windows用户&#xff0c;都提供了强大而灵活的设计工具&#xff0c;让设计师们能够轻松应对各种复杂的图形设计挑战。这款软件以其卓越的性能、丰富的功能和友好的用户界面&#x…

后悔没早点考?揭晓六西格玛证书背后的惊人好处

在这个竞争激烈的时代&#xff0c;不断提升自我价值和专业能力是每个职场人士都需要面对的问题。而六西格玛证书&#xff0c;作为一个备受瞩目的职业资格认证&#xff0c;其背后的好处和价值已经远超出了人们的想象。深圳天行健企业管理咨询公司解析如下&#xff1a; 一、提升职…

MySQL Undo Log

总结自bojiangzhou undo log称为撤销日志或回滚日志。在一个事务中进行增删改操作时&#xff0c;都会记录对应的 undo log。在对数据库进行修改前&#xff0c;会先记录对应的 undo log&#xff0c;然后在事务失败或回滚的时候&#xff0c;就可以用这些 undo log 来将数据回滚到…

iPhone数据恢复篇:iPhone 数据恢复软件有哪些

问题&#xff1a;iPhone 15 最好的免费恢复软件是什么&#xff1f;我一直在寻找一个恢复程序来恢复从iPhone中意外删除的照片&#xff0c;联系人和消息&#xff0c;但是我有很多选择。 谷歌一下&#xff0c;你会发现许多付费或免费的iPhone数据恢复工具&#xff0c;声称它们可…

数据结构--二叉树相关性质

1.性质 1.满二叉树每层节点个数&#xff1a;等比数列 3.&#xff08;重要&#xff09;任意二叉树&#xff1a;度为0&#xff08;叶子节点&#xff09;的比度为2的永远多一个。。度&#xff1a;就是看有多少孩子 如下图解析&#xff1a;&#xff08;用推到归纳来分析&#xff…

【测开能力提升-fastapi框架】介绍简单使用

0. 前期说明 立了很多flag(开了很多专题)&#xff0c;但坚持下来的没几个。也干了很多测试工作(起初是硬件(Acoustic方向)测试 - 业务功能测试 - 接口测试 - 平台功能测试 - 数据库测试 - py自动化测试 - 性能测试 - 嵌入式测试 - 到最后的python测试开发)&#xff0c;最终还是…

股票分析系统设计方案大纲与细节

股票分析系统设计方案大纲与细节 一、引言 随着互联网和金融行业的迅猛发展,股票市场已成为重要的投资渠道。投资者在追求财富增值的过程中,对股票市场的分析和预测需求日益增加。因此,设计并实现一套高效、精准的股票分析系统显得尤为重要。本设计方案旨在提出一个基于大…

3d已经做好的模型怎么改单位?---模大狮模型网

在展览3D模型设计行业中&#xff0c;经常会遇到需要将已完成的模型进行单位转换的需求。这可能涉及从一种度量单位转换为另一种&#xff0c;例如从英制单位转换为公制单位&#xff0c;或者根据特定的展览场地要求进行尺寸调整。本文将探讨如何有效地修改已完成的3D模型的单位&a…

VS Code 扩展如何发布到私有Nexus的正确姿势

VS Code扩展的发布 VS Code 扩展的发布需要使用到vsce&#xff0c;vsce是一个用于打包、发布和管理 VS Code 扩展的命令行工具。可以通过 npm 来全局安装它&#xff1a; npm install -g vsce发布扩展到微软的应用市场 VS Code 的应用市场基于微软自己的 Azure DevOps。要发布…

防御---001

一、实验拓扑二、要求 1&#xff0c;DMZ区内的服务器&#xff0c;办公区仅能在办公时间内(9:00 - 18:00)可以访问&#xff0c;生产区的的设备全天可以访问. 2&#xff0c;生产区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网 3,办公区设备10.0.2.10不允许访问DMZ…

Linux的tmp目录占用空间100%问题分析和解决

一、背景 系统运行期间&#xff0c;客户突然反馈上传文档传不上去。研发立马排查日志&#xff0c;发现日志中出现大量的“No space avaliable on disk”&#xff0c;下意识应用服务器磁盘满了&#xff0c;赶快连上服务器查看磁盘空间占用情况&#xff1a; 黑人问号脸&#xff…

利用Hbuilder创建vue3的web项目

大体流程如下 npm install vue-router4 下载完&#xff0c;就创建完了