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