袁一泳
【摘要】 本文提供了一種對(duì)手機(jī)的代碼的合法性進(jìn)行鑒定的管理方法,利用Nand Flash的OTP(One Time Programmable)區(qū)域來存放hash簽名中的密鑰。在手機(jī)啟動(dòng)時(shí)對(duì)手機(jī)運(yùn)行代碼進(jìn)行認(rèn)證,可以確保手機(jī)代碼沒有經(jīng)過攻擊者的修改,避免了手機(jī)被惡意修改從而被非法使用的現(xiàn)象。
【關(guān)鍵字】 OTP區(qū) 安全認(rèn)證
一、技術(shù)領(lǐng)域
本文涉及嵌入式系統(tǒng)技術(shù),更具體地,涉及對(duì)手機(jī)安全啟動(dòng)的技術(shù)。
二、背景技術(shù)
隨著移動(dòng)通訊技術(shù)的發(fā)展,手機(jī)已經(jīng)進(jìn)入千家萬戶。手機(jī)的代碼卻有著一定的脆弱性,市場上的某些人可能將手機(jī)的存儲(chǔ)介質(zhì)中的代碼進(jìn)行修改,以達(dá)到一定的目的?;蛘呤謾C(jī)可能被非法下載其他代碼。所有這些對(duì)于手機(jī)設(shè)備商或運(yùn)營商而言都是不希望看到的。有鑒于此,本文提出了一種可以對(duì)手機(jī)中將要運(yùn)行的代碼進(jìn)行認(rèn)證的方法,如果是設(shè)備商認(rèn)可的代碼,則可以允許該代碼在手機(jī)中運(yùn)行,如果該代碼不能通過手機(jī)的安全認(rèn)證,則不允許該代碼在手機(jī)中啟動(dòng)運(yùn)行。OTP區(qū),在一般的NAND FLASH器件上都會(huì)有一塊OTP區(qū)域,OTP含義是 One Time Programmable,即一次可編程區(qū),OTP(一次可編程)存儲(chǔ)區(qū)的特性與一般FLASH存儲(chǔ)器不同,一般FLASH存儲(chǔ)器可以通過擦除命令恢復(fù)出廠狀態(tài)(0xFF),然后可以重新寫入數(shù)據(jù),而OTP存儲(chǔ)區(qū)一旦寫入數(shù)據(jù)后,就無法通過擦除命令恢復(fù)出廠狀態(tài),即對(duì)于每個(gè)bit位,只能從“1”改寫為“0”,而不能從“0”改寫為“1”,即不可逆。存儲(chǔ)器廠家保證OTP區(qū)域的可使用性,不會(huì)有壞塊的情況。
三、具體內(nèi)容
為了解決現(xiàn)有技術(shù)中的問題,本方法提供了一種手機(jī)安全啟動(dòng)的方法,手機(jī)的啟動(dòng)過程同大多數(shù)嵌入式式系統(tǒng)一樣,分為boot階段和OS操作系統(tǒng)階段。不論是手機(jī)產(chǎn)品還是嵌入式系統(tǒng),都需要一個(gè)OS系統(tǒng)(或封閉式OS系統(tǒng),或開發(fā)式OS系統(tǒng)),系統(tǒng)上電后,總是先運(yùn)行啟動(dòng)代碼boot,完成CPU的初始化,以及各種外設(shè)和外部存儲(chǔ)器(NandFlash,Sdram)然后將處理權(quán)交給OS系統(tǒng),運(yùn)行各式應(yīng)用程序。這一段啟動(dòng)代碼就是我們通常所說的boot代碼。此處所講的OS代碼,不僅僅指的是手機(jī)的嵌入式操作系統(tǒng),還有與之相關(guān)的在該操作系統(tǒng)上運(yùn)行的其他應(yīng)用任務(wù)程序代碼。正常的手機(jī)啟動(dòng)過程是手機(jī)上電,系統(tǒng)自動(dòng)將boot代碼加載到ram中運(yùn)行,此時(shí)boot的任務(wù)就是初始化CPU,初始化NandFlash,Sdram,加載下一級(jí)運(yùn)行代碼OS到Sdram中。等到OS加載完成后,從boot手中將CPU控制權(quán)交到OS控制,開始執(zhí)行OS代碼。但是在有些非法使用者在拿到手機(jī)后會(huì)用一些手段防止有些手機(jī)在未經(jīng)授權(quán)的情況下被非法用戶通過強(qiáng)力手段,通過TRACE32或類似的擦寫Flash的方法將原來存在的代碼擦除掉,然后再將修改過的或者未經(jīng)授權(quán)認(rèn)證的代碼下載到手機(jī)中使用。
本方法的一個(gè)方面提供了一種在手機(jī)啟動(dòng)時(shí)boot階段對(duì)手機(jī)即將運(yùn)行的操作系統(tǒng)及相關(guān)應(yīng)用代碼進(jìn)行安全認(rèn)證的方法。本方法將boot階段認(rèn)證操作系統(tǒng)及相關(guān)應(yīng)用代碼認(rèn)證的密鑰存放在NAND FLASH的OTP區(qū)域,該區(qū)域不存在壞塊問題,可以確保密鑰不會(huì)遭到非法修改。
對(duì)OTP區(qū)的讀寫操作同其他的NAND FLASH的block不同,對(duì)于sumsung的Nand Flash對(duì)OTP區(qū)域的讀寫命令。OTP(One Time Programmable)block是Nand Flash里一個(gè)隱藏的block,該block必須使用特殊的指令來存取,以三星的Nand Flash為例,對(duì)普通block的一個(gè)page進(jìn)行讀操作的時(shí)序其指令部分只有一個(gè)字節(jié)(0x00),對(duì)OTP block的一個(gè)page進(jìn)行讀操作的時(shí)序其指令部分有三個(gè)字節(jié)(0x30,0x65和0x00)。對(duì)普通block的一個(gè)page進(jìn)行寫操作的時(shí)序其指令部分只有一個(gè)字節(jié)(0x80), 對(duì)OTP block的一個(gè)page進(jìn)行寫操作的時(shí)序其指令部分有三個(gè)字節(jié)(0x30,0x65和0x80)。通過這種不同的讀寫操作,OTP區(qū)域page的讀寫與普通的block的page讀寫區(qū)別開來。所以我們可以將密鑰存儲(chǔ)在OTP區(qū)域中,不會(huì)擔(dān)心會(huì)被正常的NandFlash讀寫操作所訪問到,確保該密鑰是安全的,而且由于OTP區(qū)域的信息是一次寫好的,如果對(duì)它進(jìn)行修改的話也是不成功的。
下面分別介紹這種安全啟動(dòng)的方法:
一般的手機(jī)啟動(dòng)過程分為2個(gè)階段,Boot階段和操作系統(tǒng)運(yùn)行階段。手機(jī)上電后首先將Boot代碼從NandFlash中加載到內(nèi)部Ram或者外部Sdram中進(jìn)行運(yùn)行,主要內(nèi)容就是將系統(tǒng)的硬件部分進(jìn)行初始化,初始化NandFlash,初始化Sdram,還有與系統(tǒng)相關(guān)的一些寄存器,在這部分完成后,Boot代碼還需要將操作系統(tǒng)相關(guān)的代碼從NandFlash中拷貝到Sdram中。然后將指令執(zhí)行權(quán)交還給操作系統(tǒng),運(yùn)行應(yīng)用程序。在此過程中很有可能出現(xiàn)一些使用者非法下載一些未經(jīng)過運(yùn)營商或設(shè)備商許可的軟件版本在手機(jī)中運(yùn)行, 或者修改部分代碼內(nèi)容在手機(jī)中運(yùn)行。為了防止這種現(xiàn)象發(fā)生,我們提出了一種安全的手機(jī)啟動(dòng)方法,在手機(jī)出廠前對(duì)手機(jī)中的操作系統(tǒng)及相關(guān)應(yīng)用代碼進(jìn)行hash運(yùn)算,得到簽名結(jié)果后附加在操作系統(tǒng)及相關(guān)應(yīng)用代碼之后下載到手機(jī)NandFlash中,在手機(jī)啟動(dòng)過程中,Boot階段加入對(duì)操作系統(tǒng)及相關(guān)應(yīng)用程序代碼的認(rèn)證過程,在拷貝這部分代碼到Sdram時(shí)通過獲取NandFlash的OTP區(qū)域中的密鑰對(duì)代碼進(jìn)行認(rèn)證運(yùn)算,若認(rèn)證結(jié)果通過,說明該代碼是經(jīng)過運(yùn)營商或設(shè)備商許可的軟件,可以在手機(jī)中運(yùn)行;如果認(rèn)證未通過,則該代碼可能是經(jīng)過修改的非法代碼,禁止其在手機(jī)中運(yùn)行。這樣做可以使一些經(jīng)過修改的未通過運(yùn)營商或設(shè)備商許可的代碼不能在手機(jī)中運(yùn)行,保護(hù)了設(shè)備商和運(yùn)營商的利益。
因而,采用本方法,實(shí)現(xiàn)了以下的優(yōu)點(diǎn):
可以有效地保證手機(jī)中運(yùn)行代碼的可靠性,確保不會(huì)有經(jīng)過非法修改的軟件代碼在手機(jī)中運(yùn)行。防止有些手機(jī)在未經(jīng)授權(quán)的情況下被非法用戶通過強(qiáng)力手段,通過TRACE32或類似的擦寫Flash的方法將原來存在的代碼擦除掉,然后再將修改過的或者未經(jīng)授權(quán)認(rèn)證的代碼下載到手機(jī)中使用。
四、具體實(shí)施方式
圖1是根據(jù)本方法對(duì)OS代碼在出廠前簽名過程的流程圖。
如圖1所示,該操作包括以下步驟:
步驟S101,手機(jī)在設(shè)備商開發(fā)工作完成后確定手機(jī)的OS最終代碼;
步驟S102,在設(shè)備廠商的簽名服務(wù)器上存放著簽名密鑰K,將OS出廠代碼通過簽名服務(wù)器進(jìn)行簽名運(yùn)算;
步驟S103,通過服務(wù)器的簽名服務(wù)器運(yùn)算得到簽名結(jié)果M;
步驟S104,將簽名結(jié)果附加到OS代碼的最后;
圖2是根據(jù)本方法在手機(jī)啟動(dòng)時(shí)boot過程中對(duì)OS代碼合法性進(jìn)行認(rèn)證的流程圖。
如圖2所示,該操作包括以下步驟:
步驟S201,手機(jī)上電啟動(dòng),運(yùn)行boot代碼,初始化NandFlash相關(guān)配置寄存器;
步驟S202,通過配置參數(shù)對(duì)系統(tǒng)所使用的外部Sdram進(jìn)行配置;
步驟S203,從NandFlash中讀取出手機(jī)的OS代碼并拷貝到Sdram中;
步驟S204,從NandFlash的OTP區(qū)域中讀取出認(rèn)證密鑰K;
步驟S205,對(duì)Sdram中的OS代碼進(jìn)行認(rèn)證算法運(yùn)算,得到認(rèn)證值N;
步驟S206,將認(rèn)證算法運(yùn)算得到的認(rèn)證值N與附加到OS代碼后的簽名值M進(jìn)行比較。
步驟S206,將認(rèn)證算法運(yùn)算得到的認(rèn)證值N與附加到OS代碼后的簽名值M進(jìn)行比較。
步驟S207,若值M與值N相等,則證明該OS代碼是經(jīng)過設(shè)備商認(rèn)證的合法代碼,手機(jī)可以繼續(xù)運(yùn)行。
步驟S208,若值M與值N不相等,則證明該OS代碼不是是經(jīng)過設(shè)備商認(rèn)證的合法代碼,手機(jī)關(guān)機(jī)。
綜上所述,采用本方法,可以對(duì)手機(jī)的運(yùn)行代碼進(jìn)行檢查,防止使用經(jīng)過修改的非法代碼在手機(jī)中運(yùn)行,能夠有效地保證手機(jī)運(yùn)行的安全性。