鴻蒙開發:Universal Keystore Kit(密鑰管理服務)【密鑰派生(C/C++)】

密鑰派生(C/C++)

以HKDF256密鑰為例,完成密鑰派生。具體的場景介紹及支持的算法規格,請參考[密鑰生成支持的算法]。

在CMake腳本中鏈接相關動態庫

   target_link_libraries(entry PUBLIC libhuks_ndk.z.so)

開發步驟

生成密鑰

  1. 指定密鑰別名。

  2. 初始化密鑰屬性集,可指定參數,OH_HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG(可選),用于標識基于該密鑰派生出的密鑰是否由HUKS管理。

    • 當TAG設置為OH_HUKS_STORAGE_ONLY_USED_IN_HUKS時,表示基于該密鑰派生出的密鑰,由HUKS管理,可保證派生密鑰全生命周期不出安全環境。
    • 當TAG設置為OH_HUKS_STORAGE_KEY_EXPORT_ALLOWED時,表示基于該密鑰派生出的密鑰,返回給調用方管理,由業務自行保證密鑰安全。
    • 若業務未設置TAG的具體值,表示基于該密鑰派生出的密鑰,即可由HUKS管理,也可返回給調用方管理,業務可在后續派生時再選擇使用何種方式保護密鑰。
  3. 調用OH_Huks_GenerateKeyItem生成密鑰,具體請參考[密鑰生成]。

  4. 開發前請熟悉鴻蒙開發指導文檔gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md點擊或者復制轉到。

除此之外,開發者也可以參考[密鑰導入],導入已有的密鑰。

密鑰派生

  1. 獲取密鑰別名、指定對應的屬性參數HuksOptions。

    可指定參數OH_HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG(可選),用于標識派生得到的密鑰是否由HUKS管理。

    生成派生規格
    OH_HUKS_STORAGE_ONLY_USED_IN_HUKSOH_HUKS_STORAGE_ONLY_USED_IN_HUKS密鑰由HUKS管理
    OH_HUKS_STORAGE_KEY_EXPORT_ALLOWEDOH_HUKS_STORAGE_KEY_EXPORT_ALLOWED密鑰返回給調用方管理
    未指定TAG具體值OH_HUKS_STORAGE_ONLY_USED_IN_HUKS密鑰由HUKS管理
    未指定TAG具體值OH_HUKS_STORAGE_KEY_EXPORT_ALLOWED密鑰返回給調用方管理
    未指定TAG具體值未指定TAG具體值密鑰返回給調用方管理

    注:派生時指定的TAG值,不可與生成時指定的TAG值沖突。表格中僅列舉有效的指定方式。

  2. 調用[OH_Huks_InitSession]初始化密鑰會話,并獲取會話的句柄handle。

  3. 調用[OH_Huks_UpdateSession]更新密鑰會話。

  4. 調用[OH_Huks_FinishSession]結束密鑰會話,完成派生。

刪除密鑰

當密鑰廢棄不用時,需要調用OH_Huks_DeleteKeyItem刪除密鑰。

#include "huks/native_huks_api.h"
#include "huks/native_huks_param.h"
#include <string.h>
OH_Huks_Result InitParamSet(struct OH_Huks_ParamSet **paramSet,const struct OH_Huks_Param *params,uint32_t paramCount)
{OH_Huks_Result ret = OH_Huks_InitParamSet(paramSet);if (ret.errorCode != OH_HUKS_SUCCESS) {return ret;}ret = OH_Huks_AddParams(*paramSet, params, paramCount);if (ret.errorCode != OH_HUKS_SUCCESS) {OH_Huks_FreeParamSet(paramSet);return ret;}ret = OH_Huks_BuildParamSet(paramSet);if (ret.errorCode != OH_HUKS_SUCCESS) {OH_Huks_FreeParamSet(paramSet);return ret;}return ret;
}
static const uint32_t DERIVE_KEY_SIZE_32 = 32;
static struct OH_Huks_Blob g_deriveKeyAlias = {(uint32_t)strlen("test_derive"),(uint8_t *)"test_derive"
};
static struct OH_Huks_Param g_genDeriveParams[] = {{.tag =  OH_HUKS_TAG_ALGORITHM,.uint32Param = OH_HUKS_ALG_AES}, {.tag =  OH_HUKS_TAG_PURPOSE,.uint32Param = OH_HUKS_KEY_PURPOSE_DERIVE}, {.tag =  OH_HUKS_TAG_DIGEST,.uint32Param = OH_HUKS_DIGEST_SHA256}, {.tag =  OH_HUKS_TAG_KEY_SIZE,.uint32Param = OH_HUKS_AES_KEY_SIZE_256}
};
static struct OH_Huks_Param g_hkdfParams[] = {{.tag =  OH_HUKS_TAG_ALGORITHM,.uint32Param = OH_HUKS_ALG_HKDF}, {.tag =  OH_HUKS_TAG_PURPOSE,.uint32Param = OH_HUKS_KEY_PURPOSE_DERIVE}, {.tag =  OH_HUKS_TAG_DIGEST,.uint32Param = OH_HUKS_DIGEST_SHA256}, {.tag =  OH_HUKS_TAG_DERIVE_KEY_SIZE,.uint32Param = DERIVE_KEY_SIZE_32}
};
static struct OH_Huks_Param g_hkdfFinishParams[] = {{.tag =  OH_HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG,.uint32Param = OH_HUKS_STORAGE_ONLY_USED_IN_HUKS}, {.tag =  OH_HUKS_TAG_KEY_ALIAS,.blob = g_deriveKeyAlias}, {.tag =  OH_HUKS_TAG_ALGORITHM,.uint32Param = OH_HUKS_ALG_HKDF}, {.tag =  OH_HUKS_TAG_KEY_SIZE,.uint32Param = DERIVE_KEY_SIZE_32}, {.tag =  OH_HUKS_TAG_PURPOSE,.uint32Param = OH_HUKS_KEY_PURPOSE_DERIVE}, {.tag =  OH_HUKS_TAG_DIGEST,.uint32Param = OH_HUKS_DIGEST_SHA256}
};
static const uint32_t COMMON_SIZE = 2048;
static const char *g_deriveInData = "Hks_HKDF_Derive_Test_00000000000000000000000000000000000000000000000000000000000""00000000000000000000000000000000000000000000000000000000000000000000000000000000""0000000000000000000000000000000000000000000000000000000000000000000000000_string";
static napi_value DeriveKey(napi_env env, napi_callback_info info)
{struct OH_Huks_Blob genAlias = {(uint32_t)strlen("test_signVerify"),(uint8_t *)"test_signVerify"};struct OH_Huks_Blob inData = {(uint32_t)strlen(g_deriveInData),(uint8_t *)g_deriveInData};struct OH_Huks_ParamSet *genParamSet = nullptr;struct OH_Huks_ParamSet *hkdfParamSet = nullptr;struct OH_Huks_ParamSet *hkdfFinishParamSet = nullptr;OH_Huks_Result ohResult;do {ohResult = InitParamSet(&genParamSet, g_genDeriveParams, sizeof(g_genDeriveParams) / sizeof(OH_Huks_Param));if (ohResult.errorCode != OH_HUKS_SUCCESS) {break;}ohResult = InitParamSet(&hkdfParamSet, g_hkdfParams, sizeof(g_hkdfParams) / sizeof(OH_Huks_Param));if (ohResult.errorCode != OH_HUKS_SUCCESS) {break;}// finish paramsetohResult = InitParamSet(&hkdfFinishParamSet, g_hkdfFinishParams, sizeof(g_hkdfFinishParams) / sizeof(OH_Huks_Param));if (ohResult.errorCode != OH_HUKS_SUCCESS) {break;}/* 1. Generate Key */ohResult = OH_Huks_GenerateKeyItem(&genAlias, genParamSet, nullptr);if (ohResult.errorCode != OH_HUKS_SUCCESS) {break;}/* 2. Derive */// Inituint8_t handleD[sizeof(uint64_t)] = {0};struct OH_Huks_Blob handleDerive = { sizeof(uint64_t), handleD };ohResult = OH_Huks_InitSession(&genAlias, hkdfParamSet, &handleDerive, nullptr);if (ohResult.errorCode != OH_HUKS_SUCCESS) {break;}// Updateuint8_t tmpOut[COMMON_SIZE] = {0};struct OH_Huks_Blob outData = { COMMON_SIZE, tmpOut };ohResult = OH_Huks_UpdateSession(&handleDerive, hkdfParamSet, &inData, &outData);if (ohResult.errorCode != OH_HUKS_SUCCESS) {break;}// Finishuint8_t outDataD[COMMON_SIZE] = {0};struct OH_Huks_Blob outDataDerive = { COMMON_SIZE, outDataD };ohResult = OH_Huks_FinishSession(&handleDerive, hkdfFinishParamSet, &inData, &outDataDerive);} while (0);(void)OH_Huks_DeleteKeyItem(&genAlias, nullptr);(void)OH_Huks_DeleteKeyItem(&g_deriveKeyAlias, nullptr);OH_Huks_FreeParamSet(&genParamSet);OH_Huks_FreeParamSet(&hkdfParamSet);OH_Huks_FreeParamSet(&hkdfFinishParamSet);napi_value ret;napi_create_int32(env, ohResult.errorCode, &ret);return ret;
}
```+

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/44939.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/44939.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/44939.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

通過電壓差判定無源晶振是否起振正確嗎?

在電子工程中&#xff0c;無源晶振作為許多數字電路的基礎組件&#xff0c;其是否成功起振對于系統的正常運行至關重要。然而&#xff0c;通過簡單檢測晶振兩端的電壓差來判斷晶振是否工作&#xff0c;這一方法存在一定的誤區&#xff0c;晶發電子將深入探討這一話題&#xff0…

2008年下半年軟件設計師【下午題】真題及答案

文章目錄 2008年下半年軟件設計師下午題--真題2008年下半年軟件設計師下午題--答案 2008年下半年軟件設計師下午題–真題 2008年下半年軟件設計師下午題–答案

四川赤橙宏海商務信息咨詢有限公司抖音電商服務靠譜嗎?

在數字化浪潮席卷全球的今天&#xff0c;電商行業蓬勃發展&#xff0c;各種新興電商平臺層出不窮。其中&#xff0c;抖音電商以其獨特的社交屬性和龐大的用戶基礎&#xff0c;迅速崛起為行業新星。四川赤橙宏海商務信息咨詢有限公司&#xff0c;作為專注于抖音電商服務的佼佼者…

個人怎么交易現貨黃金:加速形態

我們作為普通個人&#xff0c;在現貨黃金市場中交易就需要掌握相應的現貨黃金投資技巧。下面我們就來介紹一個&#xff0c;個人怎么交易現貨黃金的形態——加速形態。 加速形態是用于判斷市場趨勢力竭的情況&#xff0c;這種趨勢可以是上升&#xff0c;也可以是下跌。但是要注意…

用Qwt進行圖表和數據可視化開發

目錄 Qwt介紹 示例應用場景 典型QWT開發流程 舉一些Qwt的例子&#xff0c;多繪制幾種類型的圖像 1. 繪制折線圖 (Line Plot) 2. 繪制散點圖 (Scatter Plot) 3. 繪制柱狀圖 (Bar Plot) 4. 繪制直方圖 (Histogram) Qwt介紹 QWT開發主要涉及使用QWT庫進行圖表和數據可視化…

晉升業內新寵兒,MoE模型給了AI行業兩條關鍵出路

文 | 智能相對論 作者 | 陳泊丞 今年以來&#xff0c;MoE模型成了AI行業的新寵兒。 一方面&#xff0c;越來越多的廠商在自家的閉源模型上采用了MoE架構。在海外&#xff0c;OpenAI的GPT-4、谷歌的Gemini、Mistral AI的Mistral、xAI的Grok-1等主流大模型都采用了MoE架構。 …

第三方配件也能適配蘋果了,iOS 18與iPadOS 18將支持快速配對

蘋果公司以其對用戶體驗的不懈追求和對創新技術的不斷探索而聞名。隨著iOS 18和iPadOS 18的發布&#xff0c;蘋果再次證明了其在移動操作系統領域的領先地位。 最新系統版本中的一項引人注目的功能&#xff0c;便是對藍牙和Wi-Fi配件的配對方式進行了重大改進&#xff0c;不僅…

python如何計算兩個時間相差多少秒鐘,分鐘,小時,天,月,年

使用場景&#xff1a;在做上課記錄系統的時候&#xff0c;有上課開始時間和上課結束時間&#xff0c;需要計算這兩個時間的插值&#xff0c;以分鐘為單位。 封裝方法如下&#xff1a; from datetime import datetimedef sub_seconds(date1: str "2024-07-11 12:33:33&q…

【CORS 報錯】跨域請求問題:CORS 多種環境下的解決方案

&#x1f525; 個人主頁&#xff1a;空白詩 文章目錄 一、CORS錯誤的常見原因二、解決方案1. Vue3 Vite項目下的解決方案創建Vue3 Vite項目配置Vite的代理發送請求 2. jQuery項目下的解決方案使用CORS請求頭使用JSONP 3. 其他環境下的解決方案使用服務器端代理設置CORS頭使用…

PS拉框選擇工具

Photoshop&#xff08;PS&#xff09;中的拉框選擇工具&#xff0c;也稱為選框工具&#xff0c;是圖像處理中非常基礎且強大的工具之一。它允許用戶通過繪制矩形、橢圓形以及單行、單列的選擇框來選定圖像中的特定區域。本教程將詳細介紹選框工具的使用方法、技巧及其屬性設置。…

嵌入式Qt開發C++核心編程知識萬字總結

C核心編程 文章目錄 C核心編程1、程序的內存模型2、函數高級1.函數的默認參數2.函數的占位參數3.函數重載1.基本語法2.注意事項 3、類和對象1.類1.類的組成2.類的訪問權限3.class和struct的區別 2.構造函數&#xff08;Constructor&#xff09;1.示例2.特點 3.析構函數&#xf…

前端vue3 登錄頁面 響應式開發

一個登錄頁面 我直接上代碼了 結構是這樣的 Login 頁面 <template><a-layout class"login-box"><a-layout-content class"login-content"><a-row align"middle" justify"center" class"login-content-ma…

蝙蝠避障:為盲人出行插上科技的翅膀

在這個五彩斑斕的世界里&#xff0c;每一步都充滿了探索與驚喜。但對于我這樣的視障者來說&#xff0c;每一次出行都是一場未知的冒險。我時常面臨著難以想象的挑戰&#xff1a;如何安全地穿越繁忙的街道&#xff0c;怎樣準確地識別前方的障礙物&#xff0c;乃至簡單地找到回家…

viewmodel創建及使用分析

1、相關的類 ViewModelStore &#xff1a;管理viewModel實例&#xff0c;內部包含一個Map用來存儲viewmodel&#xff0c;內部包括put、get、clear等方法ViewModelProvider &#xff1a;管理ViewModelStore和Factory&#xff0c;Factory里面有create方法是創建對應的viewmodel的…

Facebook的未來藍圖:從元宇宙到虛擬現實的跨越

隨著科技的不斷演進和社會的數字化轉型&#xff0c;虛擬現實&#xff08;VR&#xff09;和增強現實&#xff08;AR&#xff09;作為下一代計算平臺正逐漸走進人們的視野。作為全球領先的科技公司之一&#xff0c;Facebook正在積極探索并推動這一領域的發展&#xff0c;以實現其…

嫌云服務器太貴,使用內網穿透代替

企業與個人開發者常常面臨一個現實問題&#xff1a;高昂的云服務器成本。隨著業務需求的增長&#xff0c;持續的服務器租賃費用可能成為負擔。然而&#xff0c;在這個充滿創新的時代&#xff0c;一種名為“內網穿透”的技術正逐漸成為解決這一難題的優選方案。本文將探討內網穿…

深度學習基礎與實戰:Python實現

深度學習基礎與實戰&#xff1a;Python實現 深度學習是機器學習的一個重要分支&#xff0c;通過多層神經網絡實現對數據的自動特征提取和建模。本文將介紹深度學習的基礎概念、常用框架以及一個完整的實戰項目&#xff0c;幫助讀者從基礎入門到實際應用。 目錄 深度學習概述…

CF 1986D. Mathematical Problem

原題鏈接&#xff1a;Problem - 1986D - Codeforces 題意&#xff1a;一串長度最多為20的由數字組成的字符串&#xff0c;在這些數字中間可以添加字符串長度減去二數量的符號&#xff0c;加或者乘&#xff0c;例如1234&#xff0c;就可以添加加號或者乘號二個&#xff0c;變成…

vue中el-table前端導出excel數據表格

一、el-table為正常時&#xff0c;導出方法如下&#xff1a; 1.添加導出按鈕 <el-button class"greenLinearbg dc" size"small" click"webExportTotalExcel()" v-if"totalBillShow">導出</el-button>2.導出方法 // we…

Spring開發實踐(二)

EnableAsync 和 Async 注解的使用方法 EnableAsync 和 Async 是Spring框架中的兩個注解&#xff0c;用于啟用和使用異步方法執行。它們可以幫助你在Spring應用程序中實現異步編程&#xff0c;從而提高應用程序的性能和響應速度。 EnableAsync EnableAsync 注解用于啟用Sprin…