寧教我負天下人,休叫天下人負我。
大家都知道梟雄曹操,錯殺了呂伯奢之后的這句名言 - 寧教我負天下人,休叫天下人負我。把這句話寫在這里,并不表示我們同意他的觀點,而是這種人從古至今,由中而外,大有人在??纯粗車环ㄇ终紕e人勞動成果的事情,比比皆是。所以我們能做的,可能就是以小人之心,度小人之腹,盡可能多加防范。
就拿工程師們來說,干一個項目,畫板子調(diào)程序,辛辛苦苦幾個月,甚至一年半載的,產(chǎn)品終于上市大賣開始賺錢。這時候如果有人把程序讀出來,然后復制出產(chǎn)品,賣得還更便宜,實在是一件讓人吐血的事情。
把程序加密,無疑是一個防小人的好辦法。我們這里介紹一種比較流行的加密方式,它利用芯片里的唯一識別碼,為每一個MCU單獨授權(quán),這樣即使程序被讀出,也沒有辦法在其它的MCU上運行。我們講一下它的工作原理,以及一款可以實現(xiàn)加密量產(chǎn),可以授權(quán)燒寫次數(shù)的工具。
一種流行的加密方法
如上圖中所示,MCU中一般都有一個UDID(Unique Device IDentifier),這個唯一識別碼,每一個MCU都是不一樣的,燒寫工具可以讀出這個UDID,然后通過算法,計算出一個授權(quán)(License),燒寫MCU程序(APP)時,連同這個授權(quán)碼一起寫入Flash。當MCU上電運行時,也讀取自己的UDID,然后通過同一算法,計算出授權(quán)碼,并和工具寫入的授權(quán)碼做對比,如果不相同就拒絕執(zhí)行下面的程序。下面舉個例子。
如圖,三個MCU的UDID分別為1,3,5。通過一種算法計算出1和3的授權(quán)碼分別為0和4。從1和3號讀出的程序,寫入5號是無法運行的。因為我們會發(fā)現(xiàn),程序用5計算出的授權(quán)碼,不等于0也不等于4,無法通過比對,程序無法繼續(xù)運行。
那么我們能根據(jù)1和3的已知信息,反推出算法嗎?可以試試看,經(jīng)過一番猜測,我們發(fā)現(xiàn)一個算法,(UDID–1)*2 對于1號和3號MCU完全適用。我們不由得一陣興奮!經(jīng)過計算(5-1)*2=8,我們把8寫入5號MCU的授權(quán)地址,然后發(fā)現(xiàn)程序并沒有運行???
怎么回事?因為算法是猜測的。我們完全可以反推出另外一種算法:(UDID-1)*(UDID-1)。對于1和3也是適用的,但對于5,結(jié)果是16。
對于簡單的數(shù)字尚且如此,而UDID一般長度有16個字節(jié),用戶再混入自己的密鑰數(shù)字,用加減乘除,異或等運算計算出授權(quán),想要逆向推測出算法還是很難的。如果想要進一步增加安全性,可以采用更高級別的加密算法。
為了增加逆向分析的難度,還可以在用戶程序中綜合采取一些措施。比如:不直接讀取UDID和授權(quán)碼,而是用兩個地址運算生成讀取地址;使用inline內(nèi)聯(lián)函數(shù);多次校驗并延時觸發(fā)等。
加密算法
對稱加密
加密和解密使用同一密鑰。所以發(fā)送端和接收端都要對密鑰嚴格保密。對稱加密好處是運算速度快。常用的有DES,3DES,AES,以及我國的SM1。
非對稱加密
它的密鑰分為公鑰和私鑰,公鑰是公開的,但是從公鑰無法推導出私鑰。非對稱加密的好處是,只需要保密私鑰就行了。其缺點是消耗資源比較多,運算速度慢。常用的有RSA,ECC以及我國的SM2。
反過來,我們也可以用私鑰加密,然后用公鑰解密,這種方式通常用來完成簽名的驗證。把MCU的UDID讀出來,用私鑰加密生成授權(quán)碼,和應(yīng)用程序一起寫入MCU的Flash,然后MCU的應(yīng)用程序就可以用公鑰完成授權(quán)碼的驗證。采用非對稱加密算法的好處是,即使算法是公開的,公鑰也是公開的,別人只要沒有獲得私鑰,就沒辦法為其它MCU生成授權(quán)碼。
加密算法的安全性
首先想個問題,如果我們給家里裝個防盜門,是越堅固的越好嗎?好像沒毛病。但仔細一想還真不是這樣,我們大多數(shù)家里安裝的,并不一定是市場上最好最貴的。
加密算法也沒有絕對的安全。理論上只有一次一密,也就是采用跟明文長度一樣密鑰,而且只使用一次,才是絕對的安全。所以我們采用什么算法,要根據(jù)我們的實際需要。在一定時間長度內(nèi),如果破解的代價遠大于所獲得的價值,我們就認為是安全的。還有就是盡可能使用長一些的密鑰,跟蹤密碼學的最新動態(tài)。
安全單片機和普通單片機
對于任何加密方式,密鑰的存儲是安全的關(guān)鍵。對于普通的單片機,現(xiàn)在一般在Flash區(qū)都會有保護字節(jié),可以設(shè)置成編程后無法讀出。密鑰存儲在里面,通過常規(guī)手段是無法讀到的。但是對于非常規(guī)手段,這種安全性就不夠了。
但是對于非常規(guī)手段,就無效了。比如把MCU的外殼溶解掉,然后暴露出內(nèi)部的硅片,這樣就可以直接觀察,修改里面存儲的內(nèi)容。所以對于安全等級高的應(yīng)用,比如金融等,也要求MCU具有更高級別的安全防范措施。這種MCU會把密鑰存儲在一小塊兒RAM里,用電池供電。為了保證存儲在RAM里的密鑰不被非法讀走,采取各種防范措施。比如芯片外部有探測引腳,一旦發(fā)現(xiàn)外部電路被破壞,馬上銷毀密鑰。在芯片內(nèi)部,用金屬絲網(wǎng)包住關(guān)鍵區(qū)域,一旦被破壞,也會銷毀密鑰。同時這種MCU內(nèi)部也會集成隨機數(shù)生成,硬加密算法模塊等,加速加解密的運算速度。
采用哪種單片機,也要根據(jù)實際需要來決定。
加密量產(chǎn)工具
創(chuàng)芯工坊的Power Writer,是一款挺實用的量產(chǎn)燒錄工具。它可以通過MCU的唯一識別碼,對每一個MCU生成單獨的授權(quán)。加密算法有消耗資源特別少的向量矩陣加密,也有加密級別更高的ECDSA橢圓數(shù)字簽名算法,還支持用戶使用自己的算法。除此之外,他還能授權(quán)燒寫的MCU個數(shù),燒寫MCU的UDID范圍等。用戶可以把程序上傳到云端,客戶聯(lián)網(wǎng)在線獲得授權(quán),進行芯片燒錄,也可以把程序加載進燒寫器,用戶采用離線燒錄。
掃碼加入嵌入式交流群: