一种安全启动手机的方法
2015年11月27日 15:00 作者:□袁一泳 中兴通讯股份有限公司□袁一泳 中兴通讯股份有限公司
【摘要】 本文提供了一种对手机的代码的合法性进行鉴定的管理方法,利用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 代码不是是经过设备商认证的合法代码,手机关机。
综上所述,采用本方法,可以对手机的运行代码进行检查,防止使用经过修改的非法代码在手机中运行,能够有效地保证手机运行的安全性。初始化NandFlash 初始化SDRAM 继续开机流程M=N ? BOOT失败,手机关机从NandFlash中拷贝OS 代码到SDRAM中从OTP区域读取出密钥K 用密钥K对OS代码进行hash运算,得到签名值N 将N值与OS代码后附加的签名值M进行比较否是201 202 203 204 205 206 208 207 OS代码密钥K Hash算法进行签名得到签名M 将签名结果M附加到OS代码后下载到手机NandFlash中102 103 104