李 順,肖龍遠
(中國工程物理研究院電子工程研究所,四川綿陽,621900)
采用“用戶名+密碼”的原始模式進行身份認證已不再安全,為此提出了很多新的身份認證技術(shù),如智能卡技術(shù)、生物識別技術(shù)。目前的智能卡已經(jīng)可以采用DES算法及基于RSA的PKI體系進行認證,也可以存儲和操作基于X.509的CA數(shù)字證書,但由于智能卡本身的硬件限制,使得進行RSA運算顯得非常緩慢,雖然有些智能卡附有協(xié)處理器加快了數(shù)學運算,但增加了成本開銷。生物特征識別技術(shù)是利用人體生物特征來進行身份驗證的一種解決方案。指紋識別技術(shù)是眾多生物識別技術(shù)中最為實用和最為成熟的技術(shù)之一,指紋識別技術(shù)同智能卡,密碼等身份識別手段相比,具有不可替代、不可假冒、不易丟失等優(yōu)點[1]。本文將指紋識別技術(shù)應用于嵌入式終端用戶身份認證過程,有效解決了智能卡方案中認證速度慢、密碼認證方法安全性低的問題。
AT91SAM9261是Atmel公司推出的基于ARM9的32位處理器。在工作頻率為180MHz的情況下,其運算速度為200MIPS。其內(nèi)部支持LCD控制器、串行通信口(包括USB從機模塊、UART、SPI以及I2C)和多媒體通信口,還提供一個用于調(diào)試的JTAG接口。功耗方面,AT91SAM9261待機電流僅為2.5μA,工作頻率為 500Hz時,電流消耗為 400μA。而且AT91SAM9261價格便宜,功耗低,又能滿足設計需要,所以AT91SAM9261非常適合用于嵌入式終端的開發(fā)。
采用艾菲爾公司的指紋模塊EFM-250,EFM-250是通用型指紋識別模塊,能完成指紋采集、指紋登記、指紋1:N和1:1比對等與指紋有關(guān)的操作。它由高速信號處理器DSP、射頻原理真皮指紋傳感器(滑動式)、高性能指紋比對算法等軟硬件組成。EFM-250具有體積特別小,比對速度更快,指紋容量更大等特點。
指紋模塊與開發(fā)板的接口是采用標準串行口進行通信(USART),開發(fā)板通過串口向模塊發(fā)送數(shù)據(jù)包,數(shù)據(jù)包中包含著指紋模塊應執(zhí)行的命令(如提取指紋、搜索指紋等)。主機發(fā)送的數(shù)據(jù)包必須嚴格按照l表1,表2格式封裝:
表1 指令包格式
表2 應答包格式
系統(tǒng)主要由AT91SAM9261芯片、指紋傳感器、指紋信息處理器、存儲芯片、電源模塊、顯示模塊以及相應的接口電路組成。使用16位的高性能SDRAM加快了數(shù)據(jù)的讀取速度,使用16M nand flash存儲嵌入式Linux操作系統(tǒng)。
圖1 系統(tǒng)硬件構(gòu)成
軟件開發(fā)主要是基于嵌入式Linux操作系統(tǒng)串口的讀寫操作以及根據(jù)通信協(xié)議開發(fā)板與指紋模塊進行通信。由于身份認證系統(tǒng)中若有些操作(如設置超級用戶密碼)出錯,將會影響以后的通信,這就需要通信過程中盡量避免出現(xiàn)收包出錯的現(xiàn)象。本文采取了良好的出錯處理機制,并利用select函數(shù)防止串口阻塞,提高了代碼的魯棒性和健壯性[2]。
串行口是計算機的一種常用接口,具有連接線少,通訊簡單,得到廣泛使用。Linux中,串口COM1和COM2分別對應操作系統(tǒng)的/dev/ttyS0,/dev/ttyS1兩個設備文件。Linux對設備的訪問是通過設備文件的訪問來進行的,對串口的讀寫就相當于對文件的讀寫[5]。
5.1.1 打開串口
fd=open(“/dev/ttyS1”,O_RDWR);//設置成可讀可寫,默認阻塞模式
5.1.2 設置串口屬性
串口的屬性定義在結(jié)構(gòu)體struct termios中。為在程序中使用該結(jié)構(gòu)體,需要包含文件<termios.h>,該結(jié)構(gòu)體定義如下:
struct termios
{
tcflag_t c_iflag;/*輸入選項標志*/
tcflag_t c_oflag;/*輸出選項標志*/
tcflag_t c_cflag;/*控制選項標志*/
tcflag_t c_lflag;/*本地選項標志*/
cc_t c_line;/*line discipline*/
cc_t c_cc[NCCS];/* control characters*/
speed_t c_ispeed;/* input speed*/
speed_t c_ospeed;/* output speed*/
};
在這個結(jié)構(gòu)中最為重要的是c_cflag,通過對它的復制可以設置波特率、字符大小、數(shù)據(jù)位、校驗位、停止位,流控協(xié)議等。輸入模式c_iflag成員控制端口接收端的字符輸入處理。c_cc包含了超時參數(shù)和控制字符的定義。
設置串口流程:
(1)保存原先的串口配置:這里可以使用函數(shù)tcgetattr(fd,&oldtio),這個函數(shù)得到與fd指向?qū)ο蟮南嚓P(guān)參數(shù),并將它們保存于oldtio引用的termios結(jié)構(gòu)中;
(2)激活選項CLOCAL和CREAD:CLOCAL和CREAD分別用于本地連接和接收使能,通過位掩碼的方式激活這兩個選項;
(3)設置波特率:設置波特率有專門的函數(shù)cfsetispeed和cfsetospeed;
(4)設置字符大小:首先去除數(shù)據(jù)位中的位掩碼,再重新按要求設置;
(5)設置奇偶校驗位:這時需要用到兩個termios中的成員:c_cflag和c_iflag。首先要激活c_cflag中的校驗位使能標志PARENB和是否要進行校驗,同時還要激活c_iflag中的奇偶校驗使能;
(6)設置停止位:設置停止位是通過激活c_cflag中的CSTOPB而實現(xiàn)的,若停止位為1,則清除CSTOPB,若停止位為2,則激活CSTOPB;
(7)設置最少字符和等待時間:分別通過設置c_cc[VMIN]和 c_cc[VTIME]來完成
(8)處理要寫入的引用對象:由于串口在重新設置之后,要寫入的引用對象要重新處理,調(diào)用函數(shù)tcflush(fd,TCIOFLUSH);
(9)激活配置:在完成全部串口配置之后,利用函數(shù)tcsetattr激活配置;
5.1.3 串口讀寫
可用標準的文件讀寫函數(shù):
ssize_t read(int fd,const void*buf,size_t count);//如果調(diào)用成功則返回讀出的字節(jié)數(shù)
ssize_t write(int fd,const void*buf,size_t count);//如果調(diào)用成功則返回寫入的字節(jié)數(shù)
在對串口進行讀的時候,如果因為數(shù)據(jù)傳輸出錯導致讀不到數(shù)據(jù),此時read會阻塞,這時候程序?qū)罊C,解決這個問題的方法是使用select函數(shù)實現(xiàn)串口的非阻塞讀寫:
struct timeval tv;//定義select阻塞的時間
fd_set readfd;//定義文件描述符集合
tv.tv_sec=maxwaittime/1000;//SECOND
tv.tv_usec=maxwaittime%1000*1000;//USECOND
FD_SET(fd,&readfd);
rc=select(fd+1,&readfd,NULL,NULL,&tv);
為了便于與指紋模塊通信,定義了結(jié)構(gòu)package_struct,直接通過package_read和package_send函數(shù)來實現(xiàn)對串口的發(fā)包、收包、解包的工作,兩個函數(shù)定義如下:
int SendPackage(package_struct package_send);
int ReceivePackage(package_struct*package_receive,unsigned short package_len);
身份認證系統(tǒng)實現(xiàn)的功能有:
(1)設置超級用戶口令,用戶需要先驗證超級用戶口令才能進行其他操作,該口令默認為0;
(2)自動登記新指紋,自動搜索指紋庫中的空位,提取指紋特征,進行存儲;
(3)自動識別指紋,提取指紋特征,搜索指紋庫,搜索到返回指紋的ID號及指紋匹配分數(shù);
(4)清空指紋庫,清空指紋庫中所有的指紋特征;
(5)刪除某個或多個指紋,刪除指紋庫中指定ID號開始的N個指紋特征;
(6)手動登記,手動識別,,這兩個功能需要多次發(fā)送指令包和接收解析包。手動登記需要用戶指定指紋特征的存儲位置,操作較繁瑣,圖1中沒有給出兩者的實現(xiàn)流程;
軟件流程圖如圖2所示。
采用指紋識別技術(shù)對嵌入式終端用戶進行身份認證,詳細介紹了Linux中串口應用的開發(fā),根據(jù)efm250的通信協(xié)議利用串口與指紋模塊進行交互,在基于AT91SAM9261的開發(fā)板上實現(xiàn)了身份認證系統(tǒng)的各種功能。經(jīng)過測試,該系統(tǒng)認證速度快、可靠性高。
圖2 軟件流程圖
[1]柴曉光,岑寶熾.民用指紋識別技術(shù)[M].北京:人民郵電出版社,2004.
[2]冉林倉.Red Hat Linux 9編程開發(fā)與網(wǎng)絡管理[M].北京:電子工業(yè)出版社,2006.
[3]Greg Hankins.Linux Serial HOWTO v1.11[DB/OL].http://www.chinalinuxpub.com/.
[4]馬忠梅.ARM&Linux嵌入式教程[M].北京:北京航空航天大學出版社,2004.
[5]Kurt Wall.GNU/Linux編程指南(第二版)[M].張輝,譯.北京:清華大學出版社,2006.
[6]Sweet MR.Serial Programming Guide for POSIX Operating Systems[M].O’Reily& Associations,2002.