袁一泳
【摘要】 本文提供了一种对手机的代码的合法性进行鉴定的管理方法,利用Nand Flash的OTP(One Time Programmable)区域来存放hash签名中的密钥。在手机启动时对手机运行代码进行认证,可以确保手机代码没有经过攻击者的修改,避免了手机被恶意修改从而被非法使用的现象。
【关键字】 OTP区 安全认证
一、技术领域
本文涉及嵌入式系统技术,更具体地,涉及对手机安全启动的技术。
二、背景技术
随着移动通讯技术的发展,手机已经进入千家万户。手机的代码却有着一定的脆弱性,市场上的某些人可能将手机的存储介质中的代码进行修改,以达到一定的目的。或者手机可能被非法下载其他代码。所有这些对于手机设备商或运营商而言都是不希望看到的。有鉴于此,本文提出了一种可以对手机中将要运行的代码进行认证的方法,如果是设备商认可的代码,则可以允许该代码在手机中运行,如果该代码不能通过手机的安全认证,则不允许该代码在手机中启动运行。OTP区,在一般的NAND FLASH器件上都会有一块OTP区域,OTP含义是 One Time Programmable,即一次可编程区,OTP(一次可编程)存储区的特性与一般FLASH存储器不同,一般FLASH存储器可以通过擦除命令恢复出厂状态(0xFF),然后可以重新写入数据,而OTP存储区一旦写入数据后,就无法通过擦除命令恢复出厂状态,即对于每个bit位,只能从“1”改写为“0”,而不能从“0”改写为“1”,即不可逆。存储器厂家保证OTP區域的可使用性,不会有坏块的情况。
三、具体内容
为了解决现有技术中的问题,本方法提供了一种手机安全启动的方法,手机的启动过程同大多数嵌入式式系统一样,分为boot阶段和OS操作系统阶段。不论是手机产品还是嵌入式系统,都需要一个OS系统(或封闭式OS系统,或开发式OS系统),系统上电后,总是先运行启动代码boot,完成CPU的初始化,以及各种外设和外部存储器(NandFlash,Sdram)然后将处理权交给OS系统,运行各式应用程序。这一段启动代码就是我们通常所说的boot代码。此处所讲的OS代码,不仅仅指的是手机的嵌入式操作系统,还有与之相关的在该操作系统上运行的其他应用任务程序代码。正常的手机启动过程是手机上电,系统自动将boot代码加载到ram中运行,此时boot的任务就是初始化CPU,初始化NandFlash,Sdram,加载下一级运行代码OS到Sdram中。等到OS加载完成后,从boot手中将CPU控制权交到OS控制,开始执行OS代码。但是在有些非法使用者在拿到手机后会用一些手段防止有些手机在未经授权的情况下被非法用户通过强力手段,通过TRACE32或类似的擦写Flash的方法将原来存在的代码擦除掉,然后再将修改过的或者未经授权认证的代码下载到手机中使用。
本方法的一个方面提供了一种在手机启动时boot阶段对手机即将运行的操作系统及相关应用代码进行安全认证的方法。本方法将boot阶段认证操作系统及相关应用代码认证的密钥存放在NAND FLASH的OTP区域,该区域不存在坏块问题,可以确保密钥不会遭到非法修改。
对OTP区的读写操作同其他的NAND FLASH的block不同,对于sumsung的Nand Flash对OTP区域的读写命令。OTP(One Time Programmable)block是Nand Flash里一个隐藏的block,该block必须使用特殊的指令来存取,以三星的Nand Flash为例,对普通block的一个page进行读操作的时序其指令部分只有一个字节(0x00),对OTP block的一个page进行读操作的时序其指令部分有三个字节(0x30,0x65和0x00)。对普通block的一个page进行写操作的时序其指令部分只有一个字节(0x80), 对OTP block的一个page进行写操作的时序其指令部分有三个字节(0x30,0x65和0x80)。通过这种不同的读写操作,OTP区域page的读写与普通的block的page读写区别开来。所以我们可以将密钥存储在OTP区域中,不会担心会被正常的NandFlash读写操作所访问到,确保该密钥是安全的,而且由于OTP区域的信息是一次写好的,如果对它进行修改的话也是不成功的。
下面分别介绍这种安全启动的方法:
一般的手机启动过程分为2个阶段,Boot阶段和操作系统运行阶段。手机上电后首先将Boot代码从NandFlash中加载到内部Ram或者外部Sdram中进行运行,主要内容就是将系统的硬件部分进行初始化,初始化NandFlash,初始化Sdram,还有与系统相关的一些寄存器,在这部分完成后,Boot代码还需要将操作系统相关的代码从NandFlash中拷贝到Sdram中。然后将指令执行权交还给操作系统,运行应用程序。在此过程中很有可能出现一些使用者非法下载一些未经过运营商或设备商许可的软件版本在手机中运行, 或者修改部分代码内容在手机中运行。为了防止这种现象发生,我们提出了一种安全的手机启动方法,在手机出厂前对手机中的操作系统及相关应用代码进行hash运算,得到签名结果后附加在操作系统及相关应用代码之后下载到手机NandFlash中,在手机启动过程中,Boot阶段加入对操作系统及相关应用程序代码的认证过程,在拷贝这部分代码到Sdram时通过获取NandFlash的OTP区域中的密钥对代码进行认证运算,若认证结果通过,说明该代码是经过运营商或设备商许可的软件,可以在手机中运行;如果认证未通过,则该代码可能是经过修改的非法代码,禁止其在手机中运行。这样做可以使一些经过修改的未通过运营商或设备商许可的代码不能在手机中运行,保护了设备商和运营商的利益。
因而,采用本方法,实现了以下的优点:
可以有效地保证手机中运行代码的可靠性,确保不会有经过非法修改的软件代码在手机中运行。防止有些手机在未经授权的情况下被非法用户通过强力手段,通过TRACE32或类似的擦写Flash的方法将原来存在的代码擦除掉,然后再将修改过的或者未经授权认证的代码下载到手机中使用。
四、具体实施方式
图1是根据本方法对OS代码在出厂前签名过程的流程图。
如图1所示,该操作包括以下步骤:
步骤S101,手机在设备商開发工作完成后确定手机的OS最终代码;
步骤S102,在设备厂商的签名服务器上存放着签名密钥K,将OS出厂代码通过签名服务器进行签名运算;
步骤S103,通过服务器的签名服务器运算得到签名结果M;
步骤S104,将签名结果附加到OS代码的最后;
图2是根据本方法在手机启动时boot过程中对OS代码合法性进行认证的流程图。
如图2所示,该操作包括以下步骤:
步骤S201,手机上电启动,运行boot代码,初始化NandFlash相关配置寄存器;
步骤S202,通过配置参数对系统所使用的外部Sdram进行配置;
步骤S203,从NandFlash中读取出手机的OS代码并拷贝到Sdram中;
步骤S204,从NandFlash的OTP区域中读取出认证密钥K;
步骤S205,对Sdram中的OS代码进行认证算法运算,得到认证值N;
步骤S206,将认证算法运算得到的认证值N与附加到OS代码后的签名值M进行比较。
步骤S206,将认证算法运算得到的认证值N与附加到OS代码后的签名值M进行比较。
步骤S207,若值M与值N相等,则证明该OS代码是经过设备商认证的合法代码,手机可以继续运行。
步骤S208,若值M与值N不相等,则证明该OS代码不是是经过设备商认证的合法代码,手机关机。
综上所述,采用本方法,可以对手机的运行代码进行检查,防止使用经过修改的非法代码在手机中运行,能够有效地保证手机运行的安全性。