1、聊一聊 https://www.toutiao.com/article/7210050607242035746/?log_from=fbfd1a2edf7d1_1684465202700 今天跟大家?guī)淼闹R(shí)不算難,現(xiàn)在非常多MCU都有全球唯一標(biāo)識(shí)碼這個(gè)東西,可能大家都了解過,不過具體怎么用并沒有實(shí)際設(shè)計(jì)過!下面重點(diǎn)對(duì)其加密方面的應(yīng)用跟大家理一理。 2、stm32的標(biāo)識(shí)碼UID 對(duì)于目前大部分MCU都會(huì)存在一個(gè)唯一標(biāo)識(shí)碼供用戶使用,同樣stm32也是一樣,通過查找對(duì)應(yīng)的數(shù)據(jù)手冊(cè)便可以得到該唯一標(biāo)識(shí)碼的具體信息。 這里以stm32F103為例,其他型號(hào)的stm32性能也可能不存在該唯一標(biāo)識(shí),具體需要根據(jù)對(duì)應(yīng)的數(shù)據(jù)手冊(cè)進(jìn)行查閱,如果存在可能基地址稍有不同。如下圖所示: ![]()
2、讀取UID 對(duì)于該唯一標(biāo)識(shí)ID,bug菌這里談兩點(diǎn)注意的: 1、唯一標(biāo)識(shí)ID只是stm32里面一種ID,其實(shí)一款芯片內(nèi)部還有很多其他ID,比如設(shè)備ID和其他內(nèi)部組件的ID等; 2、UID一共是96位具有唯一性,而截取中間的幾位不一定具有唯一性。 3、對(duì)于UID的讀取非常簡單,上面的手冊(cè)截圖也說明了,可以通過字節(jié)、半字和字來進(jìn)行讀取,也就是說可以用8位、16位、32位來讀取。
![]() 3、UID加密簡易版 之前bug菌整理過一篇單片機(jī)解密的文章<【整理】一文帶你了解"單片機(jī)解密"技術(shù)>,對(duì)于解密的辦法可以說是無比的殘忍,其實(shí)芯片的加密與解密跟網(wǎng)絡(luò)安全的攻防是一樣的。 所謂:"道高一尺魔高一丈",只有不斷的更新加密技術(shù)以增加解密成本或許在一定程度上能夠遏制不正規(guī)解密行為在,下面就先介紹一下UID的一種簡易加密方案,為什么說簡易呢?可以說修改部分固件實(shí)現(xiàn)一個(gè)跳轉(zhuǎn)功能就解密了,不過對(duì)于一般的小型產(chǎn)品還是能夠在一定程度上起到保密效果的。 ![]()
4、加強(qiáng)版本 對(duì)于上面的加密方法其關(guān)卡點(diǎn)就一個(gè)位置,如果在固件空白區(qū)域安插一些跳轉(zhuǎn)指令跳轉(zhuǎn)到正常運(yùn)行的位置,你的固件就解密了。 所以目前比較常用的是對(duì)整個(gè)固件進(jìn)行完整性標(biāo)識(shí)序列與UID組合進(jìn)行加密的辦法。 ![]() ![]() 所以對(duì)于未使用的存儲(chǔ)區(qū)域最好是都填充完,避免被解密者利用。 4、另類版本 出于關(guān)卡點(diǎn)過于單一的問題考慮,我們需要進(jìn)行多處的關(guān)卡點(diǎn)處理,同樣各個(gè)關(guān)卡點(diǎn)的復(fù)雜度也會(huì)給解密者帶來困難,每一處關(guān)卡點(diǎn)都帶有解密信息,相當(dāng)于每次都會(huì)需要判斷機(jī)密,從而讓跳轉(zhuǎn)這種辦法失效。 最簡單的處理辦法就是定義一些宏處理,比如:
不過這樣的辦法如果放在訪問較為頻繁的位置,勢(shì)必會(huì)影響系統(tǒng)的性能,如果所使用的芯片性能一般,可以選擇部分關(guān)鍵關(guān)卡點(diǎn)處理。 好吧,所以一切安全的前提是唯一標(biāo)識(shí)碼UID無法被修改,否則也是徒勞,不過既然芯片都是人造的,那肯定就有辦法進(jìn)行解密,只是成本問題。 5、最后小結(jié) 本文到這里就結(jié)束了,對(duì)于MCU的加密和解密是一個(gè)永恒的話題,同樣對(duì)于一個(gè)成熟的產(chǎn)品加密也是必須要考慮的技術(shù)問題,看看大家還有什么好的MCU加密辦法,歡迎大家分享留言討論! |
|