精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

鴻蒙開發:Universal Keystore Kit密鑰管理服務 密鑰派生ArkTS

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-07-11 16:20 ? 次閱讀

密鑰派生(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]結束密鑰會話,完成派生。

QQ截圖20240705210937.png

刪除密鑰

當密鑰廢棄不用時,需要調用[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);
}

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 密鑰
    +關注

    關注

    1

    文章

    137

    瀏覽量

    19742
  • 鴻蒙
    +關注

    關注

    57

    文章

    2321

    瀏覽量

    42749
收藏 人收藏

    評論

    相關推薦

    鴻蒙開發Universal Keystore Kit密鑰管理服務簡介

    Universal Keystore Kit密鑰管理服務,下述簡稱為HUKS)向業務/應用提供
    的頭像 發表于 07-04 14:20 ?385次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發</b>:<b class='flag-5'>Universal</b> <b class='flag-5'>Keystore</b> <b class='flag-5'>Kit</b><b class='flag-5'>密鑰</b><b class='flag-5'>管理</b><b class='flag-5'>服務</b>簡介

    鴻蒙開發Universal Keystore Kit密鑰管理服務 生成密鑰ArkTS

    以生成DH密鑰為例,生成隨機密鑰。具體的場景介紹及支持的算法規格
    的頭像 發表于 07-05 15:17 ?297次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發</b>:<b class='flag-5'>Universal</b> <b class='flag-5'>Keystore</b> <b class='flag-5'>Kit</b><b class='flag-5'>密鑰</b><b class='flag-5'>管理</b><b class='flag-5'>服務</b> 生成<b class='flag-5'>密鑰</b><b class='flag-5'>ArkTS</b>

    鴻蒙開發Universal Keystore Kit密鑰管理服務 密鑰導入介紹及算法規格

    如果業務在HUKS外部生成密鑰(比如應用間協商生成、服務器端生成),業務可以將密鑰導入到HUKS中由HUKS進行管理密鑰一旦導入到HUKS
    的頭像 發表于 07-06 10:45 ?657次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發</b>:<b class='flag-5'>Universal</b> <b class='flag-5'>Keystore</b> <b class='flag-5'>Kit</b><b class='flag-5'>密鑰</b><b class='flag-5'>管理</b><b class='flag-5'>服務</b> <b class='flag-5'>密鑰</b>導入介紹及算法規格

    鴻蒙開發Universal Keystore Kit密鑰管理服務 明文導入密鑰 ArkTS

    分別以導入AES256與RSA2048密鑰為例,具體的場景介紹及支持的算法規格
    的頭像 發表于 07-08 10:22 ?353次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發</b>:<b class='flag-5'>Universal</b> <b class='flag-5'>Keystore</b> <b class='flag-5'>Kit</b><b class='flag-5'>密鑰</b><b class='flag-5'>管理</b><b class='flag-5'>服務</b> 明文導入<b class='flag-5'>密鑰</b> <b class='flag-5'>ArkTS</b>

    鴻蒙開發Universal Keystore Kit 密鑰管理服務 加密導入密鑰 ArkTS

    以加密導入ECDH密鑰對為例,涉及業務側加密密鑰的[密鑰生成]、[協商])等操作不在本示例中體現。
    的頭像 發表于 07-08 14:22 ?317次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發</b>:<b class='flag-5'>Universal</b> <b class='flag-5'>Keystore</b> <b class='flag-5'>Kit</b> <b class='flag-5'>密鑰</b><b class='flag-5'>管理</b><b class='flag-5'>服務</b> 加密導入<b class='flag-5'>密鑰</b> <b class='flag-5'>ArkTS</b>

    鴻蒙開發Universal Keystore Kit密鑰管理服務 加密導入密鑰C、C++

    以加密導入ECDH密鑰對為例,涉及業務側加密密鑰的[密鑰生成]、[協商]等操作不在本示例中體現。
    的頭像 發表于 07-08 15:26 ?332次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發</b>:<b class='flag-5'>Universal</b> <b class='flag-5'>Keystore</b> <b class='flag-5'>Kit</b><b class='flag-5'>密鑰</b><b class='flag-5'>管理</b><b class='flag-5'>服務</b> 加密導入<b class='flag-5'>密鑰</b>C、C++

    鴻蒙開發Universal Keystore Kit 密鑰管理服務 密鑰協商ArkTS

    以協商密鑰類型為X25519 256,并密鑰僅在HUKS內使用為例,完成密鑰協商。
    的頭像 發表于 07-10 09:22 ?299次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發</b>:<b class='flag-5'>Universal</b> <b class='flag-5'>Keystore</b> <b class='flag-5'>Kit</b> <b class='flag-5'>密鑰</b><b class='flag-5'>管理</b><b class='flag-5'>服務</b> <b class='flag-5'>密鑰</b>協商<b class='flag-5'>ArkTS</b>

    鴻蒙開發Universal Keystore Kit 密鑰管理服務 密鑰協商 C、C++

    以協商密鑰類型為ECDH,并密鑰僅在HUKS內使用為例,完成密鑰協商。具體的場景介紹及支持的算法規格,請參考[密鑰生成支持的算法]。
    的頭像 發表于 07-10 14:27 ?324次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發</b>:<b class='flag-5'>Universal</b> <b class='flag-5'>Keystore</b> <b class='flag-5'>Kit</b> <b class='flag-5'>密鑰</b><b class='flag-5'>管理</b><b class='flag-5'>服務</b> <b class='flag-5'>密鑰</b>協商 C、C++

    鴻蒙開發Universal Keystore Kit密鑰管理服務 密鑰派生介紹及算法規格

    在密碼學中,密鑰派生函數(Key derivation function,KDF)使用偽隨機函數從諸如主密碼或密碼的秘密值中派生出一個或多個密鑰
    的頭像 發表于 07-11 16:30 ?303次閱讀

    鴻蒙開發Universal Keystore Kit密鑰管理服務 密鑰派生C、C++

    以HKDF256密鑰為例,完成密鑰派生。具體的場景介紹及支持的算法規格,請參考[密鑰生成支持的算法]。
    的頭像 發表于 07-11 14:28 ?271次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發</b>:<b class='flag-5'>Universal</b> <b class='flag-5'>Keystore</b> <b class='flag-5'>Kit</b><b class='flag-5'>密鑰</b><b class='flag-5'>管理</b><b class='flag-5'>服務</b> <b class='flag-5'>密鑰</b><b class='flag-5'>派生</b>C、C++

    鴻蒙開發Universal Keystore Kit 密鑰管理服務 HMAC ArkTS

    HMAC是密鑰相關的哈希運算消息認證碼(Hash-based Message Authentication Code),是一種基于Hash函數和密鑰進行消息認證的方法。
    的頭像 發表于 07-12 18:22 ?606次閱讀

    鴻蒙開發Universal Keystore Kit密鑰管理服務 密鑰刪除ArkTS

    為保證數據安全性,當不需要使用該密鑰時,應該刪除密鑰
    的頭像 發表于 07-12 14:56 ?274次閱讀

    鴻蒙開發Universal Keystore Kit 密鑰管理服務 獲取密鑰屬性ArkTS

    HUKS提供了接口供業務獲取指定密鑰的相關屬性。在獲取指定密鑰屬性前,需要確保已在HUKS中生成或導入持久化存儲的密鑰
    的頭像 發表于 07-17 10:46 ?296次閱讀

    鴻蒙開發Universal Keystore Kit 密鑰管理服務 獲取密鑰屬性C C++

    HUKS提供了接口供業務獲取指定密鑰的相關屬性。在獲取指定密鑰屬性前,需要確保已在HUKS中生成或導入持久化存儲的密鑰
    的頭像 發表于 07-17 09:47 ?335次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>開發</b>:<b class='flag-5'>Universal</b> <b class='flag-5'>Keystore</b> <b class='flag-5'>Kit</b> <b class='flag-5'>密鑰</b><b class='flag-5'>管理</b><b class='flag-5'>服務</b> 獲取<b class='flag-5'>密鑰</b>屬性C C++

    鴻蒙開發Universal Keystore Kit 密鑰管理服務 查詢密鑰別名集 ArkTS

    HUKS提供了接口供應用查詢密鑰別名集。
    的頭像 發表于 07-18 09:34 ?314次閱讀