隨著物聯網和邊緣計算的出現,五花八門的MCU也被應用其中,如何保證我們的程序安全和知識產權不受侵犯呢,本文我們將對主流MCU的程序加密進行講解,希望能夠幫助你選擇最適合自己應用的微處理器。
1. MCU加密
通常所說的MCU加密是指將用戶的程序固件保護起來,防止別人通過外部調試接口或者其他方法讀取燒寫在Flash中的程序。保護自家方案不輕易被別家抄襲,從硬件上保護自己的知識產權。MCU加密還指防止自家程序被惡意讀取破解。
2. 常用MCU加密方式
通過寫特定配置字;
增加外部加密芯片;
對程序代碼進行密碼加密,使程序變成密文;
程序校驗芯片的唯一ID。
2.1 配置字加密
2.1.1 原理
MCU廠商在設計芯片時在芯片中增加特定的非易失存儲,該存儲也可能是Flash的特定地址區域。用戶可以通過外部工具或在程序的特定地址寫入使能存儲保護的值。
配置字加密在芯片完成上電時序后才會生效,一般包含以下功能:
禁能調試接口(JTAG/SWD);
不禁能調試接口,但不允許調試器連接內核和訪問Flash和RAM空間;
關閉讀寫Flash的ISP指令;
禁止除芯片正常執行程序外讀Flash操作;
禁能芯片從外部接口或RAM啟動執行代碼。
2.1.2 應用場景
這種加密方式通常用在程序存儲在芯片內部Flash的系統中。例如NXP LPC系列MCU、GD32系列MCU、NXP Kineits Cortex-M系列。
2.2 外接加密芯片
2.2.1 原理
加密芯片保護程序的方式,是通過程序與外部加密IC的交互來確認程序是否進一步執行。
利用芯片隨機數外設或者其他能夠產生隨機數的機制,在每次上電后系統取得一個隨機數,并將這個隨機數通過類似IIC的協議傳給外部的硬件加密IC。隨后系統按先前約定的算法進行結果計算,等待外部IC接收到隨機數并也算出結果后,外部IC會將計算結果傳回給系統。如果系統的計算結果和外部IC的計算結果相同,則說明外部的加密IC存在。
2.2.2 應用場景
這種加密方式主要用在用戶對代碼中關鍵算法的加密,算法通常會以Lib的方式提供,只有購買了對應加密芯片(類似于產品密鑰)的客戶才能夠使用算法程序。
2.3 UID檢驗加密
2.3.1 原理
UID加密一種用戶主動加密的方式。當下幾乎所有處理器內部都包含UID,可以通過直接尋址讀取或者IAP指令獲得。
UID加密通常分為二種方式:
用戶在燒寫程序時,讀取一次芯片UID將其寫入Flash特定區域。在程序啟動時直接讀取UID和Flash內部的數值進行比較決定是否啟動;
用戶讀取UID后通過私有密鑰將UID加密之后的信息寫入Flash特定地址,例如Flash的最后一個扇區。程序啟動時,首先讀取芯片UID并通過同樣的密鑰和算法進行計算后與Flash中的數值進行比較決定是否啟動。
其中第一種最容易被破解,第二種也存在潛在風險,為了增強第二種的安全性,可以將加密后的數據拆分后分別存放到Flash的不同位置,運行時再組合。
2.3.2 應用場景
主要用在一些不需要太多保護的協議棧上,例如LoRa協議棧、文件系統、私有操作系統等。協議棧相對算法的價值會低一些,增加加密芯片的成本顯得過高。
同時這種方式也可延伸為使用PID(每個型號的ID相同)來區分設備型號。
2.4 程序固件加密
2.4.1 原理
程序固件加密是指通過私有密鑰將整個程序固件加密計算后生成密文,使得程序即使被其他人拿到后也不可能被反編譯。這種加密方式通常需要有一段地址存儲密鑰和解密程序,他們可以是芯片內部Bootloader或用戶自己的Bootloader。
2.4.2 應用場景
這種加密方式主要用于芯片沒有內部Flash或Flash較小,以及需要給用戶升級固件的產品上。例如:
芯片從外部Flash啟動時,外部Flash很容易被拷貝,盜版。這種應用通常芯片內部具備OTP區域用于編程密鑰;
芯片內部Flash較小時可以將算法等文件放置在外部Flash中,運行時解密到內部RAM執行。密鑰通常和內部Flash的程序一同存儲;
使用在產品需要后期升級功能算法的項目中,可以在Bootloader中放置解密程序,升級的過程中,Bootloader將收到的固件解密燒寫到內部Flash中。這樣既可以隨意發送產品更新固件,同時不用擔心知識產權被侵害。
例如i.MX RT1050系列芯片就是使用程序固件加密,程序被放置在外部Flash中,執行時邊解密邊執行,對i.MX RT1050系列的加密問題可以聯系我們。
3. 常用芯片的加密方式
3.1 NXP LPC系列
LPC系列MCU大多采用配置字加密方式,即CRP(Code Read Protection)加密。將配置字(CRP Key)寫入特定的Flash地址中。芯片上電啟動后內部boot會根據配置選擇禁用相應的功能。
CRP是一種允許用戶在系統中啟用不同級別的安全性的機制,從而可以限制對片上閃存的訪問和ISP的使用。當需要時,通過在0x0002FC中閃存位置編程特定模式來調用CRP。IAP命令不受代碼讀取保護的影響。
以LPC824位例,在啟動文件(*.s)中找到CRP Key根據需要進行修改,如圖3.1。
圖3.1 CRP Key示例
注:切記在產品最終固件中才可使用CRP3,否則芯片將被鎖死不能再被解鎖。
3.2 NXP Kineits Cortex-M系列
Kineits Cortex-M系列的加密同樣使用配置字的方式寫入Flash特定區域,但它比LPC系列相對復雜一些功能也更加強大。
Kineits Cortex-M系列的加密包含在FlashConfig區域,FlashConfig包含一些用于芯片內部Boot的配置信息,比如使能或禁能NMI引腳中斷。
圖3.2 FSL的FlashConfig段
使用keil工具可以快速使用UI配置,如圖3.3所示:
圖3.3 啟動文件配置
3.3 GD32系列
GD32系列加密與和STM32系列加密方式類似。GD32內部包含一個FMC外設。FMC提供了一個安全保護功能來阻止非法讀取閃存。此功能可以很好地保護軟件和固件免受非法的用戶操作。
FMC包含一個OB_RDPT字節與其補字節:
當將OB_RDPT字節和它的補字節被設置為0x5AA5,系統復位以后,閃存將處于非安全保護狀態;
當設置OB_RDPT字節和它的補字節值為任何除0x5AA5外的值,系統復位以后,安全保護狀態生效;
在安全保護狀態下,主存儲閃存塊僅能被用戶代碼訪問且前4KB的閃存自動處于頁擦除/編程保護狀態下。在調試模式下,或從SRAM中啟動時,以及從boot loader區啟動時,這些模式下對主存儲塊的操作都被禁止;
如果將OB_RDPT字節和它的補字節設置為0x5AA5,安全保護功能將失效,并自動觸發一次整片擦除操作。
GD官方提供加密工具GigaDevice_MCU_ISP_Programmer或者使用FlyMCU等工具,操作界面如圖3.4所示:
圖3.4 GD32使用FlyMCU加密
3.4 i.MX RT系列
i.MX RT系列是NXP公司發布的跨界處理器,MPU的處理性能、MCU的開發方式。該系列不包含用戶可用的內部Flash,所有代碼都要存儲在外部存儲介質中。它使用FSL獨有的HAB安全機制,能夠達到比前面更安全的加密機制。
i.MX RT的加密是將程序固件完全通過工具轉換為密文,不能夠被反編譯,同時i.MX RT內部包含OTP區域,用于編程密鑰信息和啟動信息,加密后不可讀取。
芯片使用QSPI或HypeFlash時,可以實現邊運行邊解密,不占用額外的RAM空間,同時硬件解密配合內核中32KB ICache和32KB DCache使得程序運行不會受到固件加密的影響;
芯片還支持Boot時完全解密程序到內部RAM或外部SDRAM,這種方式代碼的啟動速度略微變慢,但是能夠支持更多的啟動方式:SD卡、MMC、Nand Flash等。
NXP提供加密工具CSF和密鑰燒寫工具FlashLoader,用于程序固件的加密和燒寫。如有任何疑問可聯系我們的FAE獲得支持。
-
芯片
+關注
關注
455文章
50817瀏覽量
423678 -
mcu
+關注
關注
146文章
17149瀏覽量
351216 -
加密
+關注
關注
0文章
304瀏覽量
23922
原文標題:安全加密(一):這些MCU加密方法你都知道嗎?
文章出處:【微信號:Zlgmcu7890,微信公眾號:周立功單片機】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論