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





