HarmonyOS Next 非對稱金鑰生成實戰:多演算法與多方式詳解

SameX發表於2024-11-18

本文旨在深入探討華為鴻蒙HarmonyOS Next系統(截止目前API12)的技術細節,基於實際開發實踐進行總結。
主要作為技術分享與交流載體,難免錯漏,歡迎各位同仁提出寶貴意見和問題,以便共同進步。
本文為原創內容,任何形式的轉載必須註明出處及原作者。

一、引言

在當今數字化時代,安全通訊已然成為資訊互動的基石。非對稱金鑰技術作為保障資訊保安的關鍵手段,在安全通訊領域中發揮著不可或缺的作用。與對稱金鑰不同,非對稱金鑰使用公鑰和私鑰這一對獨特的“鑰匙”,公鑰可以公開,任何人都能使用它來加密資訊,而私鑰則被嚴格保密,只有擁有者才能使用它來解密資訊。這種特性使得非對稱金鑰在身份認證、資料加密和數字簽名等方面具有獨特的優勢,能夠有效防止資訊被竊取、篡改和偽造,為我們的數字生活提供了堅實的安全保障。接下來,我們將深入探討 HarmonyOS Next 中如何生成非對稱金鑰對,以及不同演算法和生成方式的特點與應用。

二、非對稱金鑰生成和轉換規格

(二)指定規格方式差異與應用場景

  1. 字串引數方式
    - 這種方式簡單直觀,透過特定的字串格式來描述所需生成的金鑰規格。例如,對於 RSA 演算法,使用“RSA 金鑰型別|素數個數”的格式,如“RSA1024|PRIMES_2”表示生成 RSA1024 型別、素數個數為 2 的金鑰。對於其他演算法,如 ECC 的“ECC 金鑰長度”格式(如“ECC256”)、SM2 的“SM2_金鑰長度”格式(如“SM2_256”)等。這種方式適用於快速建立常見規格的金鑰,在開發過程中,如果開發者對金鑰規格有明確的需求且符合預定義的字串格式,使用字串引數可以方便快捷地生成金鑰。例如,在一個簡單的加密通訊示例中,開發者可以直接使用“RSA2048|PRIMES_2”來生成一個用於加密會話金鑰的 RSA 金鑰對。
  2. 金鑰引數方式
    - 金鑰引數方式則更加靈活和精確,它允許開發者透過詳細的金鑰引數來構建金鑰。以 RSA 為例,需要指定模數(n)、公鑰指數(pk)等引數;對於 ECC 演算法,需要指定橢圓曲線的引數(如 p、a、b、g、n、h 等)以及公鑰和私鑰的值。這種方式適用於需要自定義金鑰引數的高階場景,如在某些特定的安全協議實現中,根據協議要求精確構建符合標準的金鑰。例如,在一個與特定安全標準相容的應用中,開發者可能需要根據標準文件中定義的金鑰引數,使用金鑰引數指定方式來生成符合要求的 ECC 金鑰對。

三、指定 PEM 格式字串資料轉換非對稱金鑰對(ArkTS 示例)

(一)轉換要求

  1. 公鑰需滿足 X.509 規範、PKCS#1 規範、PEM 編碼格式。這意味著公鑰的格式必須符合 X.509 標準中定義的結構,並且使用 PKCS#1 標準進行編碼,同時以 PEM 格式進行封裝,以便於在不同系統之間進行傳輸和儲存。
  2. 私鑰需滿足 PKCS#8 規範、PKCS#1 規範、PEM 編碼格式。私鑰同樣需要遵循特定的規範和格式要求,以確保其安全性和相容性。PKCS#8 規範定義了私鑰的儲存和加密格式,與 PKCS#1 規範相結合,保證了私鑰在不同應用中的正確使用。

(二)程式碼實現細節

  1. 首先,準備好符合要求的 PEM 格式字串資料,包括公鑰和私鑰字串。例如:
let priKeyPkcs1Str1024: string = "-----BEGIN RSA PRIVATE KEY-----\nMIICXQIBAAKBgQCwIN3mr21+N96ToxnVnaS+xyK9cNRAHiHGgrbjHw6RAj3V+l+W\nY68IhIe3DudVlzE9oMjeOQwkMkq//HCxNlIlFR6O6pa0mrXSwPRE7YKG97CeKk2g\nYOS8YEh8toAvm7xKbiLkXuuMlxrjP2j/mb5iI/UASFSPZiQ/IyxDr0AQaQIDAQAB\nAoGAEvBFzBNa+7J4PXnRQlYEK/tvsd0bBZX33ceacMubHl6WVZbphltLq+fMTBPP\nLjXmtpC+aJ7Lvmyl+wTi/TsxE9vxW5JnbuRT48rnZ/Xwq0eozDeEeIBRrpsr7Rvr\n7ctrgzr4m4yMHq9aDgpxj8IR7oHkfwnmWr0wM3FuiVlj650CQQDineeNZ1hUTkj4\nD3O+iCi3mxEVEeJrpqrmSFolRMb+iozrIRKuJlgcOs+Gqi2fHfOTTL7LkpYe8SVg\ne3JxUdVLAkEAxvcZXk+byMFoetrnlcMR13VHUpoVeoV9qkv6CAWLlbMdgf7uKmgp\na1Yp3QPDNQQqkPvrqtfR19JWZ4uy1qREmwJALTU3BjyBoH/liqb6fh4HkWk75Som\nMzeSjFIOubSYxhq5tgZpBZjcpvUMhV7Zrw54kwASZ+YcUJvmyvKViAm9NQJBAKF7\nDyXSKrem8Ws0m1ybM7HQx5As6l3EVhePDmDQT1eyRbKp+xaD74nkJpnwYdB3jyyY\nqc7A1tj5J5NmeEFolR0CQQCn76Xp8HCjGgLHw9vg7YyIL28y/XyfFyaZAzzK+Yia\nakNwQ6NeGtXSsuGCcyyfpacHp9xy8qXQNKSkw03/5vDO\n-----END RSA PRIVATE KEY-----\n";
let publicPkcs1Str1024: string = "-----BEGIN RSA PUBLIC KEY-----\nMIGJAoGBALAg3eavbX433pOjGdWdpL7HIr1w1EAeIcaCtuMfDpECPdX6X5ZjrwiE\nh7cO51WXMT2gyN45DCQySr/8cLE2UiUVHo7qlrSatdLA9ETtgob3sJ4qTaBg5Lxg\nSHy2gC+bvEpuIuRe64yXGuM/aP+ZvmIj9QBIVI9mJD8jLEOvQBBpAgMBAAE=\n-----END RSA PUBLIC KEY-----\n";
  1. 然後,建立非對稱金鑰生成器並進行轉換:
import { cryptoFramework } from '@kit.CryptoArchitectureKit';
async function TestPkcs1ToPkcs8ByPromise() {
  let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
  let keyPair = await asyKeyGenerator.convertPemKey(publicPkcs1Str1024, priKeyPkcs1Str1024);
  let priPemKey = keyPair.priKey;
  let pubPemKey = keyPair.pubKey;
  let priString = priPemKey.getEncodedPem('PKCS8');
  let pubString = pubPemKey.getEncodedPem('X509');
  console.info("[promise]TestPkcs1ToPkcs8ByPromise priString output is " + priString);
  console.info("[promise]TestPkcs1ToPkcs8ByPromise pubString output is " + pubString);
}

- 這裡首先建立了一個 RSA 金鑰生成器,指定金鑰型別為“RSA1024”。然後使用convertPemKey方法,傳入公鑰和私鑰字串資料,將其轉換為非對稱金鑰對。轉換成功後,可以獲取轉換後的金鑰對中的公鑰和私鑰,並使用getEncodedPem方法將其轉換為指定格式(如 PKCS8 格式的私鑰和 X509 格式的公鑰)的字串,以便進行後續的操作或儲存。

四、總結

在 HarmonyOS Next 中,非對稱金鑰生成涉及多種演算法和生成方式。不同演算法如 RSA、ECC、DSA、SM2、Ed25519、X25519 和 DH 各具特點,適用於不同場景。指定規格方式有字串引數和金鑰引數兩種,我們開發者需根據實際需求選擇。在轉換非對稱金鑰對時,要遵循相應的轉換要求和流程,如 PEM 格式字串資料轉換時需確保公鑰和私鑰滿足特定規範。要點包括瞭解各種演算法的特性、掌握不同指定規格方式的適用場景等。注意事項有注意演算法的安全性和效能,如某些演算法在特定場景下可能存在安全風險或效能瓶頸;同時,要確保金鑰的妥善管理,防止金鑰洩露導致安全問題。

相關文章