HarmonyOS NEXT 對稱密鑰生成全攻略:從原理到實踐
踏入鴻蒙世界的敲門磚,標志著您在技術(shù)征途上的全新起點,提升就業(yè)競爭力,獲得行業(yè)認可,點亮職業(yè)成長先機,快人一步搶占未來應(yīng)用開發(fā)賽道!https://developer.huawei.com/consumer/cn/training/dev-cert-detail/101666948302721398?ha_source=hmosclass-csdn&ha_sourceId=89000445
本文旨在深入探討華為鴻蒙HarmonyOS NEXT系統(tǒng)(截至目前API12)的技術(shù)細節(jié),基于實際開發(fā)實踐進行總結(jié)。主要作為技術(shù)分享與交流載體,難免錯漏,歡迎各位同仁提出寶貴意見和問題,以便共同進步。本文為原創(chuàng)內(nèi)容,任何形式的轉(zhuǎn)載必須注明出處及原作者。
一、引言
在數(shù)據(jù)安全的浩瀚領(lǐng)域中,對稱密鑰猶如一把堅固的鎖,守護著我們寶貴的信息資產(chǎn)。它的重要性怎么強調(diào)都不為過,無論是個人隱私數(shù)據(jù)的加密存儲,還是企業(yè)敏感信息在網(wǎng)絡(luò)中的傳輸,對稱密鑰都扮演著關(guān)鍵角色。通過使用對稱密鑰進行加密,只有擁有相同密鑰的授權(quán)方才能解密并獲取原始數(shù)據(jù),從而有效地防止數(shù)據(jù)被未授權(quán)訪問和竊取。在各種加密技術(shù)中,對稱密鑰以其加密和解密速度快的優(yōu)勢,成為處理大量數(shù)據(jù)加密任務(wù)的首選,如文件加密、數(shù)據(jù)庫加密以及實時通信中的數(shù)據(jù)加密等場景。接下來,我們將深入探討 HarmonyOS NEXT 中對稱密鑰的生成和轉(zhuǎn)換,從原理到實踐全方位剖析這一重要技術(shù)。
二、對稱密鑰生成和轉(zhuǎn)換規(guī)格
(一) AES、3DES、SM4 等算法的特點與適用場景
1、AES 算法
- AES(Advanced Encryption Standard)作為當今最為常用的對稱加密算法之一,具有諸多顯著特點。它是一種分組密碼算法,分組長度固定為 128 位,密鑰長度則可靈活選擇 128 位、192 位或 256 位。與 3DES 相比,AES 展現(xiàn)出更高的安全性,這得益于其更為先進的加密算法結(jié)構(gòu)。同時,AES 的處理速度更快,能夠高效地處理大量數(shù)據(jù)加密任務(wù)。在實際應(yīng)用中,AES 廣泛應(yīng)用于各種對安全性和性能要求較高的場景,如在線支付系統(tǒng)中對用戶銀行卡信息的加密存儲、云計算環(huán)境下的數(shù)據(jù)中心數(shù)據(jù)加密等。
2、3DES 算法
- 3DES(Triple Data Encryption Algorithm),也稱為 3DESede 或 TripleDES,其加密原理是使用 3 個 64 位的密鑰對數(shù)據(jù)塊進行三次加密,相當于對每個數(shù)據(jù)塊執(zhí)行三次 DES(Data Encryption Standard)加密算法。這種加密方式使得 3DES 的密鑰長度更長,從而提供了比 DES 更高的安全性。然而,相對而言,其處理速度不如 AES 快。3DES 適用于一些對安全性有一定要求,但對性能要求不是特別苛刻的場景,例如某些企業(yè)內(nèi)部網(wǎng)絡(luò)中的數(shù)據(jù)加密傳輸,在硬件資源有限且 AES 支持不完全的情況下,3DES 可以作為一種過渡性的加密解決方案。
3、SM4 算法
- SM4 是我國自主研發(fā)的分組密碼算法,分組長度同樣為 128 位,密鑰長度為 128 位,并且可通過擴展密鑰增加密鑰長度。SM4 的加密算法與密鑰擴展算法都采用 32 輪非線性迭代結(jié)構(gòu),其獨特之處在于數(shù)據(jù)解密和數(shù)據(jù)加密的算法結(jié)構(gòu)相同,只是輪密鑰的使用順序相反,解密輪密鑰是加密輪密鑰的逆序。SM4 在國內(nèi)的一些安全敏感領(lǐng)域得到了廣泛應(yīng)用,如政府部門的數(shù)據(jù)加密、國內(nèi)金融機構(gòu)的部分業(yè)務(wù)加密等,以保障國家信息安全和關(guān)鍵基礎(chǔ)設(shè)施的安全。
(二)字符串參數(shù)承載密鑰規(guī)格的方式及示例
在 HarmonyOS NEXT 中,通過特定的字符串參數(shù)來承載密鑰規(guī)格,從而方便地生成對應(yīng)的密鑰。以 AES 算法為例,其字符串參數(shù)由“對稱密鑰算法”和“密鑰長度”拼接而成。具體來說,當要生成 128 位的 AES 密鑰時,對應(yīng)的字符串參數(shù)為“AES128”;生成 192 位密鑰時,字符串參數(shù)為“AES192”;生成 256 位密鑰時,字符串參數(shù)為“AES256”。這種簡潔而明確的方式使得開發(fā)者能夠直觀地指定所需的密鑰規(guī)格。同樣,對于 3DES 算法,其字符串參數(shù)為“3DES192”(表示密鑰長度為 192 位);SM4 算法的字符串參數(shù)為“SM4_128”(表示密鑰長度為 128 位)。通過這些字符串參數(shù),開發(fā)者可以在創(chuàng)建對稱密鑰生成器時,準確地指定所需的密鑰規(guī)格,為后續(xù)的加密操作奠定基礎(chǔ)。
三、隨機生成對稱密鑰(ArkTS 與 C/C++ 示例)
(一) ArkTS 代碼實現(xiàn)步驟與解釋
1、首先,導(dǎo)入必要的模塊:
這里的 cryptoFramework 是 HarmonyOS NEXT 提供的加解密算法框架模塊,通過導(dǎo)入它,我們可以使用其中的各種加密相關(guān)功能。
2、然后,創(chuàng)建對稱密鑰生成器:
在這一步中,我們使用 createSymKeyGenerator 函數(shù)并傳入字符串參數(shù)“AES256”,表示我們要創(chuàng)建一個密鑰算法為 AES、密鑰長度為 256 位的對稱密鑰生成器。這一步是根據(jù)我們之前提到的字符串參數(shù)承載密鑰規(guī)格的方式來指定所需的密鑰類型。
3、接下來,生成對稱密鑰:
調(diào)用生成器的 generateSymKey 方法來隨機生成對稱密鑰。這個方法返回一個 Promise 對象,因為密鑰生成可能需要一定的時間,特別是對于較長密鑰長度的情況。
4、最后,獲取密鑰的二進制數(shù)據(jù)并處理結(jié)果:
當密鑰生成成功后,通過 Promise 的 then 方法獲取生成的密鑰對象,并調(diào)用 getEncoded 方法獲取密鑰的二進制數(shù)據(jù)。這里將二進制數(shù)據(jù)轉(zhuǎn)換為十六進制字符串并輸出,以便開發(fā)者查看和使用生成的密鑰。
(二) C/C++ 代碼實現(xiàn)步驟與解釋(包括 CMake 腳本配置)
1、CMake 腳本配置
- 在 C/C++ 項目中使用 HarmonyOS NEXT 的加密功能,需要在 CMake 腳本中正確鏈接相關(guān)動態(tài)庫。在 CMakeLists.txt 文件中添加以下代碼:
這行代碼的作用是將 libohcrypto.so 動態(tài)庫鏈接到項目中,使得項目能夠使用其中的加密函數(shù)和功能。
2、代碼實現(xiàn)
- 首先,包含必要的頭文件:
這些頭文件提供了使用對稱密鑰生成功能所需的函數(shù)聲明和數(shù)據(jù)結(jié)構(gòu)定義。
- 然后,創(chuàng)建對稱密鑰生成器并生成密鑰:
這里首先創(chuàng)建一個 OH_CryptoSymKeyGenerator 類型的指針 ctx 來表示對稱密鑰生成器上下文,以及一個 OH_CryptoSymKey 類型的指針 keyCtx 來存儲生成的密鑰。然后使用 OH_CryptoSymKeyGenerator_Create 函數(shù)創(chuàng)建一個 AES256 密鑰生成器,傳入字符串參數(shù)“AES256”來指定密鑰規(guī)格。如果創(chuàng)建成功,接著使用 OH_CryptoSymKeyGenerator_Generate 函數(shù)生成對稱密鑰。在整個過程中,通過檢查返回的錯誤碼 ret 來確保操作的正確性,如果出現(xiàn)錯誤,及時釋放已分配的資源。
- 最后,獲取密鑰的二進制數(shù)據(jù)并釋放資源:
使用 OH_CryptoSymKey_GetKeyData 函數(shù)獲取生成密鑰的二進制數(shù)據(jù),并存儲在 out 結(jié)構(gòu)體中。然后依次銷毀密鑰生成器上下文和密鑰對象,釋放相關(guān)資源。最后,使用 OH_Crypto_FreeDataBlob 函數(shù)釋放存儲二進制數(shù)據(jù)的結(jié)構(gòu)體所占用的內(nèi)存。
四、指定二進制數(shù)據(jù)轉(zhuǎn)換對稱密鑰(ArkTS 與 C/C++ 示例)
(一) 轉(zhuǎn)換流程與代碼示例分析(ArkTS)
1、首先,獲取指定的對稱密鑰二進制數(shù)據(jù)并封裝成 DataBlob 對象:
這里定義了一個函數(shù) genKeyMaterialBlob,用于創(chuàng)建一個包含特定二進制數(shù)據(jù)的 DataBlob 對象,模擬了從外部獲取或存儲的對稱密鑰二進制數(shù)據(jù)。
2、接著,創(chuàng)建對稱密鑰生成器并進行轉(zhuǎn)換:
首先創(chuàng)建一個密鑰算法為3DES、密鑰長度為192位的對稱密鑰生成器。然后使用 convertKey 方法,傳入之前創(chuàng)建的 DataBlob 對象,嘗試將二進制數(shù)據(jù)轉(zhuǎn)換為對稱密鑰。如果轉(zhuǎn)換成功,在回調(diào)函數(shù)中獲取生成的密鑰對象,輸出其算法名稱、格式以及二進制數(shù)據(jù)(以十六進制字符串形式)。如果轉(zhuǎn)換過程中出現(xiàn)錯誤,通過捕獲異常并輸出錯誤信息。
(二) 轉(zhuǎn)換流程與代碼示例分析(C/C++)
1、同樣,先準備好二進制數(shù)據(jù)并封裝成 Crypto_DataBlob 結(jié)構(gòu):
這里定義了一個函數(shù) testConvertHmacKey,創(chuàng)建了一個包含特定字符串(模擬二進制數(shù)據(jù))的 Crypto_DataBlob結(jié)構(gòu),用于后續(xù)的轉(zhuǎn)換操作。
2、然后,創(chuàng)建對稱密鑰生成器并進行轉(zhuǎn)換:
使用 OH_CryptoSymKeyGenerator_Create 函數(shù)創(chuàng)建一個HMAC密鑰生成器(這里以HMAC為例,其他對稱密鑰算法類似),傳入算法名稱字符串。然后使用 OH_CryptoSymKeyGenerator_Convert 函數(shù),傳入準備好的二進制數(shù)據(jù) convertBlob,嘗試將其轉(zhuǎn)換為對稱密鑰。如果轉(zhuǎn)換成功,繼續(xù)后續(xù)操作;如果轉(zhuǎn)換失敗,及時銷毀已創(chuàng)建的密鑰生成器上下文并返回錯誤碼。
3、最后,獲取轉(zhuǎn)換后的密鑰二進制數(shù)據(jù)并釋放資源:
使用 OH_CryptoSymKey_GetKeyData 函數(shù)獲取轉(zhuǎn)換后密鑰的二進制數(shù)據(jù),并存儲在 out 結(jié)構(gòu)體中。然后依次銷毀密鑰生成器上下文和密鑰對象,釋放相關(guān)資源。最后,使用 OH_Crypto_FreeDataBlob 函數(shù)釋放存儲二進制數(shù)據(jù)的結(jié)構(gòu)體所占用的內(nèi)存。
五、總結(jié)
在本次對 HarmonyOS NEXT 對稱密鑰生成的深入探索中,我們詳細了解了多種生成和轉(zhuǎn)換對稱密鑰的方式。通過對 AES、3DES、SM4 等算法特點和適用場景的分析,我們能夠根據(jù)實際需求選擇最合適的算法。在隨機生成對稱密鑰方面,ArkTS 和 C/C++ 兩種實現(xiàn)方式各有特點,ArkTS 借助 Promise 實現(xiàn)了異步操作,方便在復(fù)雜應(yīng)用中管理密鑰生成過程,而 C/C++ 則通過傳統(tǒng)的函數(shù)調(diào)用和錯誤碼處理方式提供了高效的性能。在指定二進制數(shù)據(jù)轉(zhuǎn)換對稱密鑰時,同樣的兩種語言實現(xiàn)都清晰地展示了轉(zhuǎn)換流程,從數(shù)據(jù)準備、生成器創(chuàng)建到轉(zhuǎn)換操作和結(jié)果處理。
對于選擇何種生成和轉(zhuǎn)換方式,我們開發(fā)者需要綜合考慮多個因素。如果應(yīng)用是基于 ArkTS 開發(fā)且注重異步操作和簡潔的代碼結(jié)構(gòu),那么 ArkTS 的相關(guān)方法會是不錯的選擇;而如果對性能有較高要求且熟悉 C/C++ 編程,C/C++ 實現(xiàn)則更能發(fā)揮其優(yōu)勢。同時,還需考慮密鑰的使用場景、系統(tǒng)資源以及與其他組件的兼容性等因素,以上。(轉(zhuǎn)載自51CTO,作者:SameX)





