絕大多數STM32系列的芯片都在固定的地方放置了長度為96位的唯一身份識別碼,簡稱UID,只有極少數STM32系列芯片內部沒有該UID,比方超值型STM32F0x0系列,STM32F100系列。具體到哪顆芯片到底有沒有UID,在芯片數據手冊的首頁都有明確的說明,無需猜測。如下圖所以:
芯片所對應的參考手冊里,有對該UID存放地址的詳細介紹。地址因不同系列或子序列而不同。
關于這個UID常有人有些疑問,有幾個問題在這里稍微總結下:
1、有無問題。上面說了絕大部分STM32都內置UID,具體以查看數據手冊為準。
2、唯一性問題。該UID的唯一性是靠96位這個整體來保證其唯一性,你若截取部分就不保證了。
3、內容問題。有人對這個UID內容似乎很好奇,這點在STM32參考手冊里并無詳細描述,但這并不影響使用。【因為STM8有些芯片也有96位UID,那里有較為詳細的介紹,涉及芯片WAFER生產加工工程中的一些各種坐標信息、wafer編號信息、產品批號信息等】
4、地址問題。芯片UID的存放地址要到芯片對應的參考手冊里去查對。特別要提醒的是,并非所有STM32系列的UID信息存放在某個起始地址開始的連續空間內。
5、怎么用的問題。說實在的,這個就很難說了,反正STM32有這個特性在,肯定沒有固定不變的用法。具體怎么用就看你自己了。對于該UID,STM32參考手冊給了些大致應用方向的介紹:
簡單點說,該UID可以做特定序列號;做FLASH編程的安全密鑰;激活安全啟動流程。據我所知,曾有人拿這個UID碼作為唯一發射碼。中間按個做密鑰配合加密技術的應用涉及到很專業的內容, ST官方也有不少這方面的培訓材料,有興趣的可以找相關資料進一步了解學習。
相對用的比較多的就是基于該UID設計用戶程序的安全啟動。其大致原理就是,用戶程序第一次運行時將預定的未被改寫過FLASH地址寫入本芯片UID數據,之后每次啟動都會重讀UID數據并與特定FLASH地址的內容進行比對,若比對成功則正常運行,否則進入異常處理,不予正常運行程序。一般來講,編寫UID那一步在產品出廠前就完成了。
這里所說的第一次運行,就是指程序運行后,到預定的FLASH地址去讀取內容,發現該處是被擦除過且未被改寫的數據狀態[一般為全1狀態],并將UID數據寫入相應的FLASH區域,這次運行視為第一次運行。
下面使用STM32L4芯片就上面應用做個簡單的代碼實現示范,僅供參考。注意,不同STM32芯片在FLASH編程這個地方并不完全一樣。
先做些基本的準備工作。
我們根據實際應用程序情況預留出一塊地址空間,我在下面示例中將STM32L476RG內部FLASH中間位置抽出1頁來存放UID【注:很多STM32系列都具備OTP空間,也可以將UID寫在這個區域】。STM32L4的FLASH編程采用雙字編程,在給定FLASH編程地址時,注意8字節對齊。到相應的參考手冊查找UID的地址及存放情況【即是連續存放還是分散存放】。
準備工作差不多了,就可以嘗試組織程序代碼了。
程序流程很簡單。先判斷指定FLASH地址是否為全1,如果是讀取當前芯片UID并填寫到相應地址;如果不是全1,則讀取指定FLASH地址空間內容跟當前芯片UID數據比較,若正確,正常運行程序,若二者不符,則進入異常處理,不正常運行功能代碼。
【下面是監測到指定flash地址未被改寫過,進入UID內容填充的FLASH編程代碼】
【下面是監測到指定flash地址已被改寫過,進入比較判斷及相應處理的代碼】
上面代碼是基于STM32L476芯片和STM32L4Cube庫而編寫的,主要介紹下大致實現過程,簡單直觀,無須過多解釋。
不過,在實際應用過程中,這段功能代碼就不要如此直白明了。這里給幾點參考建議:
1、代碼編寫過程中,FLASH地址盡量不要一次性直接給出,最好幾經變換后得出;
2、被存放的UID在不破壞唯一性的情況下可以適當做些變換后存放;
3、將這部分代碼拆分成幾個相互獨立而有一定關聯的不同函數塊來處理。可以考慮將有的功能塊放在用戶主程序里,有的夾在正常的中斷程序里,包括嵌套的中斷程序里。
4、用來存放UID的flash地址盡量不要連續,最好在不同功能塊訪問相應的地址;
5、如果可能,考慮使用兩套完全獨立的UID改寫、比對處理代碼。即使用兩套FLASH存儲區域和比對代碼,只有兩套都比對成功后才正常運行程序,否則任何一套比對失敗都進入保護狀態。
因為剛好最近有人談起這方面的話題,就順便聊聊上面這些,權作參考。另外,還應該充分利用芯片的讀寫保護機制以及某些系列已經具有的信息安全保護機制,如PCROP、TrustZone等。還有,我們可以根據自身產品特點設計出一些結合硬件線路、機械組裝的特定自檢流程,讓盜版者在生產加工環節遇到麻煩。這些地方都留給每個設計者大量的發揮空間,來保護自己的知識產權。
總之,關于產品的產權保護,應該從產品規劃之初就著手考慮應對方案了,從最早的芯片選型開始,最好回避選用市面上使用過于普遍且老舊的芯片系列。相信芯片商在推陳出新的過程中也有安全性這方面的考量,使得芯片在這方面的性能越來完善和強大。
最后順便提醒下,當我們的程序監測到發生侵權進入保護狀態時,目的是保護自己的產權不受侵害。這個過程中我們可能會對代碼采取些行動,阻止其正常運行,但注意不要因此而給第三方帶來人身傷害。打個比方,假設你設計的產品是馬達控制類交通工具,當發現有人盜版時,如果你在代碼里只是簡單粗暴地對代碼進行破壞而完全不顧破壞后的異常代碼可能導致什么后果,那就不妙了。
-
芯片
+關注
關注
456文章
50927瀏覽量
424594 -
身份識別
+關注
關注
1文章
40瀏覽量
12665 -
STM32芯片
+關注
關注
0文章
38瀏覽量
4395
原文標題:STM32芯片UID話題
文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論