发明内容
为了确保Linux文件系统中数据的信息安全,本发明提供了一种Linux嵌入式系统的安全启动方法。所述技术方案如下:
一种Linux嵌入式系统的安全启动方法,所述方法包括:
Linux嵌入式设备中运行引导加载程序,加载Linux内核;
所述Linux内核检查所述Linux嵌入式设备上是否连接有预定的加解密设备;
若有,则将Linux文件系统数据的密文传入所述加解密设备进行解密,将解密后得到的所述Linux文件系统数据的明文传入内存中,挂载系统根目录,继续执行启动Linux嵌入式系统的其它操作;
若没有,则停止所述启动Linux嵌入式系统的操作。
所述加解密设备具体为usbkey。
所述Linux内核检查所述Linux嵌入式设备上是否连接有预定的加解密设备的方法具体包括:
所述Linux内核中预先指定所述usbkey的产品标识和厂商标识,若在所述Linux嵌入式设备上连接有与所述产品标识和厂商标识相符合的usbkey设备,则所述Linux嵌入式设备上连接有预定的加解密设备。
所述Linux内核检查所述Linux嵌入式设备上是否连接有预定的加解密设备的方法还包括:
mount_root函数调用usb_register函数注册usbkey驱动;
所述usb_register函数注册usbkey驱动过程中扫描是否有指定的产品标识和厂商标识的usbkey设备存在;
如果有,则调用所述usbkey驱动的回调函数将所述usbkey设备的设备句柄添加到数组中,Linux内核检查所述数组,若找到指定的usbkey设备,则执行所述将Linux文件系统数据的密文传入所述加解密设备进行解密操作,否则执行所述停止所述启动Linux嵌入式系统的操作;
如果没有,则执行所述停止所述启动Linux嵌入式系统的操作。
所述将Linux文件系统数据的密文传入所述加解密设备进行解密的方法具体包括:
将所述Linux文件系统数据的密文读取到内存中,将内存中的所述Linux文件系统数据的密文传入所述加解密设备中进行解密操作。
所述将内存中的所述Linux文件系统数据的密文传入所述加解密设备中进行解密操作的方法具体包括:
根据加解密算法,将内存中的所述Linux文件系统数据的密文分批地传入所述加解设备中进行解密操作。
当所述Linux内核检查所述Linux嵌入式设备上连接有预定的加解密设备时,在所述将Linux文件系统数据的密文传入所述加解密设备进行解密之前,所述方法还包括:
验证所述加解密设备与所述Linux嵌入式设备是否匹配。
验证所述加解密设备与所述Linux嵌入式设备是否匹配的方法具体包括:
所述Linux内核获取所述加解密设备中保存的一段数据,并验证所述数据是否正确;
若正确,则所述加解密设备与所述Linux嵌入式设备匹配,继续执行所述将Linux文件系统数据的密文传入所述加解密设备进行解密的步骤;
否则,所述加解密设备与所述Linux嵌入式设备不匹配,执行所述停止所述启动Linux嵌入式系统的操作的步骤。
验证所述加解密设备与所述Linux嵌入式设备是否匹配的方法还包括:
所述加解密设备获取所述Linux嵌入式设备的设备代码,所述加解密设备验证所述设备代码是否正确;
若正确,则所述加解密设备与所述Linux嵌入式设备匹配,所述加解密设备返回设备配对成功信息,继续执行所述将待解密的Linux文件系统数据传入所述加解密设备进行解密的步骤;
否则,所述加解密设备与所述Linux嵌入式设备不匹配,所述加解密设备返回设备配对失败信息,执行所述停止所述启动Linux嵌入式系统的操作的步骤。
验证所述加解密设备与所述Linux嵌入式设备是否匹配的方法还包括:
所述Linux内核发送一段数据给所述加解密设备,所述加解密设备对所述数据进行运算,并将运算结果返回给所述Linux内核验证所述运算结果是否正确;
若正确,则所述加解密设备与所述Linux嵌入式设备匹配,继续执行所述将Linux文件系统数据的密文传入所述加解密设备进行解密的步骤;
否则,所述加解密设备与所述Linux嵌入式设备不匹配,所述加解密设备返回设备配对失败信息,执行所述停止所述启动Linux嵌入式系统的操作的步骤。
所述数据为所述Linux内核生成的随机数据。
所述加解密设备对所述数据进行运算,并将运算结果返回给所述Linux内核验证所述运算结果是否正确的方法具体包括:
所述加解密设备使用预先约定的算法和密钥对所述数据进行运算;
相应地,所述Linux内核使用预先约定的算法和密钥验证所述运算结果是否正确。
当执行所述Linux内核检查Linux嵌入式设备上是否连接有预定的加解密设备的步骤时,或在执行所述将Linux文件系统数据的密文传入所述加解密设备进行解密的步骤之前,所述方法还包括:
所述加解密设备对用户进行身份认证。
所述加解密设备对用户进行身份认证的方法具体包括:
所述加解密设备验证通过自身带有的键盘或生物特征感应装置接收到的PIN码或生物特征信息,若验证所述PIN码或生物特征信息正确,则身份认证通过,可以继续执行其它操作;
或,
所述加解密设备通过所述Linux嵌入式设备获取PIN码或生物特征信息,所述加解密设备对获取到的所述PIN码或生物特征信息进行验证,若验证所述PIN码或生物特征信息正确,则身份认证通过,可以继续执行其它操作。
所述PIN码为字母、数据或可以通过键盘输入的其它字符的组合;
所述生物特征信息包括指纹、掌纹、虹膜等。
所述加解密设备解密所述Linux文件系统数据的算法包括:
DES、3DES、AES或RSA算法。
本发明提供的技术方案带来的有益效果是:
通过修改现有的Linux嵌入式系统启动流程,在Linux嵌入式系统启动时使用usbkey对加密保存的Linux文件系统数据进行解密,然后顺利地启动Linux嵌入式系统,通过这种方法,确保了Linux文件系统数据的保密性,同时还可以有效防范未经许可的用户登录Linux嵌入式系统,极大地提高了Linux嵌入式系统的安全性。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
实施例1
参见图1,本实施例采用at91rm9200开发板,Linux内核Linux-2.4.19-rmk7,使用usbkey作为加解密设备进行说明,提供了一种Linux嵌入式系统的安全启动方法,该方法包括:
步骤101.Linux嵌入式设备上电,运行引导加载程序U-BOOT;
引导加载程序是Linux嵌入式设备上电后运行的第一段代码,它包括固化在固件(firmware)中的boot代码(可选)和BootLoader两大部分;
引导加载程序用于初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为调用Linux嵌入式系统内核准备好正确的环境。
在本发明实施例中,使用的嵌入式设备的引导加载程序不包含boot代码,设备上电后首先运行BootLoader,整个系统的加载启动任务完全由BootLoader来完成。
Linux嵌入式系统中常用的BootLoader程序有U-BOOT和vivi,在本发明实施例中使用的是U-BOOT。
Uboot包含两种操作模式:“启动加载”模式和“下载”模式。
启动加载模式(BootLoading):这种模式也称为“自主”模式(Autonomous)。BootLoader从嵌入式设备上的某个固态的存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入,这种模式是BootLoader的正常模式,在本发明实施例中,BootLoader是工作在这种模式下的。
下载模式(Downloading):在这种模式下,嵌入式设备上的BootLoading将通过串口连接或网络连接等通信手段从主机(HOST)下载文件,然后控制启动流程。
步骤102.引导加载程序U-BOOT加载Linux内核程序;
在步骤102之前,BootLoader首先将内核映象从存储设备上读到内存RAM中,并为内核设置启动参数,然后跳转到内核的入口点运行加载Linux内核程序,即开始启动操作系统;
在本实施例中存储内核映象的存储设备为flash存储器;在实际应用中还可以采用其它存储器,如硬盘等。
步骤103.Linux内核程序检查是否存在预先指定的usbkey设备,若存在,则执行步骤104,否则执行步骤110;
具体地,首先Linux内核程序判断在该Linux嵌入式设备上是否连接了usbkey设备,若连接了usbkey设备,则Linux内核程序还根据预定Pid(产品标识)和Vid(厂商标识)来核对该usbkey设备是否是预先指定的usbkey设备。
mount_root函数调用usb_register注册usb驱动,注册驱动的过程中,内核扫描系统中是否有usb_register函数中已指定Pid和Vid的usbkey设备存在,如果找到这样一个设备存在,则usb_register调用回调函数将找到的usbkey的设备句柄添加到一个数组中;
内核检查usbkey句柄数组,若找到指定的usbkey,则存在预先指定的usbkey设备,执行步骤104,否则执行步骤110。
步骤104.验证usbkey与该Linux嵌入式设备是否匹配,若匹配,则执行步骤105,否则执行步骤110;
Linux内核程序调用usb_control_msg函数向usbkey发送获取用户号指令,Linux内核根据预定的用户列表对usbkey返回的用户号进行验证,若用户列表中存在该用户号,则该usbkey与该Linux嵌入式设备匹配,继续执行启动Linux嵌入式系统的其它操作。
具体调用函数的形式如下:
usb_control_msg(usbkeydev,0x11,0x21,0x09,0x300,0,buf,24)
其中括号中的参数buf里包含我们取用户号的指令0x06;
然后继续调用:
usb_control_msg(usbkeydev,0xA1,0x01,0x300,0,buf,24)
接收usbkey返回的用户号,用户号在buf中,我们预定的用户号为0x983A7DF1,则返回的buf值为0x983A7DF1。
在本发明中实施例中,验证usbkey与该Linux嵌入式设备是否匹配的步骤还可以替换为:
Linux内核向usbkey发送该Linux嵌入式设备的设备标识信息,usbkey验证该设备标识信息是否存在于usbkey中预置的设备列表中,若存在,则该usbkey与该Linux嵌入式设备匹配,usbkey返回设备配对成功信息,继续执行启动Linux嵌入式系统的其它操作;
或,
Linux内核生成一段随机数据发送给usbkey,usbkey对接收到的数据使用预先约定的算法和密钥进行运算,并将运算结果返回给Linux内核,若Linux内核验证运算结果正确,则该usbkey与该Linux嵌入式设备匹配,继续执行启动Linux嵌入式系统的其它操作;
此处使用的算法可以是DES、3DES、AES、RSA、SHA1、MD5或HAMC算法。
在本步骤之前,usbkey还可以对用户进行身份认证,具体方法包括:
用户通过usbkey上带有的键盘或生物特征感应装置输入PIN码或用户的生物特征信息,若usbkey验证该PIN码或生物特征信息正确,则该用户身份合法;
或,
usbkey通过Linux嵌入式设备获取PIN码或取用户生物特征信息,usbkey对接收到的的PIN码或生物特征信息进行验证,若usbkey验证该PIN码或生物特征信息正确,则该用户身份合法;
其中,PIN码为字母、数据或可以通过键盘输入的其它字符的组合;用户的生物特征信息包括用户的指纹、掌纹、虹膜等。
步骤105.Linux内核程序打开存储设备,将Linux文件系统数据读取到内存中;
保存Linux文件系统的存储设备可以是硬盘或flash设备,在本发明实施例中,Linux文件系统存储于flash设备中;
Linux内核程序调用“open”函数打开flash设备,调用“read”函数从flash设备中读取被加密过的Linux文件系统数据缓存到内存中。
Read函数在函数fill_inbuf中被调用,具体为:
insize=read(crd_infd,inbuf,INBUFSIZE);
其中参数crd_infd为flash设备句柄,由open函数返回,参数inbuf是一个缓冲区用于保存读取到的Linux文件系统数据的密文,参数INBUFSIZE定义了inbuf的大小,在本实施例中是2MB,read函数返回实际读到的Linux文件系统数据密文的长度,保存在insize中。在本实施例中读到的Linux文件系统数据的密文为(一部分):
步骤106.将内存中的Linux文件系统数据的密文传入usbkey进行解密,usbkey将解密的结果传回内存;
具体地,Linux内核程序调用usb_control_msg函数将内存中的Linux文件系统数据的密文传入usbkey进行解密操作,根据加/解密算法的不同,分块传入相应长度的数据;
加密Linux文件系统数据使用的算法包括DES、3DES、AES或RSA算法;在本发明实施例中,加密Linux文件系统数据采用的是AES算法,密钥长度为128位;因此,对Linux文件系统数据的密文进行解密时,每次从内存中读取128位数据传递到usbkey中进行解密,usbkey将解密后的数据返回到内存中,然后继续执行从内存中读取数据、usbkey解密、解密结果传回内存的操作,直至Linux文件系统数据的密文全部解密完毕。
实现该步骤中所述方法的代码部分如下所示:
static int_ _init fill_inbuf(void)
{
if(exit_code)return-1;
insize=read(crd_infd,inbuf,INBUFSIZE);//从flash中读取Linux
文件系统数据到内存中
if(insize==0){
error(″RAMDISK:ran out of compressed data\n″);
return-1;
}
blocksize=128;
for(offset=0;offset<insize;offset+=128)
{
if((insize-offset)<128)blocksize=insize-offset;
usb_control_msg(usbkeydev,pipe,request,value,index,inbuf+offset,bloc
ksize); //将inbuf传入usbkey,解密
usb_control_msg(usbkeydev,pipe,request_get,value,index,inbuf+offset,
blocksize);//将解密结果传回inbuf
}
inptr=1;
return inbuf[0];
}
其中,usbkey解密数据使用的密钥保存在usbkey中,不能够被读出以保证密钥的安全;
还有一种情况是,usbkey只保存加解密的密钥,Linux嵌入式设备从usbkey中读出密钥,然后由Linux内核执行解密操作,这种方法速度较快,但安全性较低。
在实际应用中还可能是仅对Linux文件系统中的部分数据进行加密,相应地,解密时只需要将被加密的部分传入usbkey中解密即可。
另一方面,对Linux文件系统数据进行加密处理的方法与解密操作类似,将内存中的Linux文件系统数据的密文分块传入相应长度的数据到usbkey中,usbkey对数据加密后传回内存。
在本发明实施例中,Linux文件系统数据是使用128位的AES算法加密的,相应地,usbkey解密时以128位为单位将Linux文件系统数据的密文通过函数usb_control_msg(usbkeydev,0x11,0x21,0x09,0x300,0,buf,130)传入到usbkey中进行解密;
其中的参数buf里包含我们解密的指令代码0x88及待解密的数据;
然后继续调用函数
usb_control_msg(usbkeydev,0xA1,0x01,0x300,0,buf,128)
接收usbkey返回的解密后的Linux文件系统数据,如此循环直到解密完所有的文件系统数据。
解密后得到的Linux文件系统数据的明文为:
步骤107.Linux内核调用解压缩程序对Linux文件系统数据进行解压缩,并将解压后的数据放入内存中预定的地址;
步骤108.执行挂载文件系统动作,将内存中的文件系统挂载到“/”,即系统根目录;
步骤109.进行其它必要的初始化操作,启动相关服务,完成Linux嵌入式系统启动;
内核会读取运行Linux文件系统中初始化程序init,并将控制权交给init程序,init程序会读取文件系统启动脚本,并执行,如设置网络地址,启动NFS服务,SSH服务等。
完成后打开一个控制台,提示用户登录,或启动用户自己设定的应用程序。步骤110.内核报错,停止启动进程。
另外,在实际的应用中,在步骤104中所示的该usbkey设备对用户进行身份认证的方法还可以应用于其它步骤中,如步骤103中Linux内核程序检查是否存在预先指定的usbkey设备的步骤里、或步骤106中usbkey设备解密Linux文件系统数据的步骤里。
在本发明实施例中,Linux嵌入式设备中的文件系统数据以密文形式进行存储,启动Linux嵌入式设备后,Linux内核通过加载usbkey设备对文件系统数据的密文进行解密,然后挂载文件系统动并继续执行启动Linux嵌入式系统的其它操作。通过该方法极大的提高了Linux嵌入式设备和Linux文件系统中数据的安全性。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。