胡海瑞 李業(yè)芹 厲菲菲
【摘要】? ? 智能卡已經(jīng)在醫(yī)療行業(yè)得到了廣泛的應(yīng)用,但主要用于對患者進行身份識別,卡片并不存儲關(guān)鍵就診信息,使得不同醫(yī)院之間的就診信息并不能共享。本文提出了基于智能卡的門診病歷存儲的文件系統(tǒng)設(shè)計和安全訪問控制機制,使得患者的病歷信息可以安全的存儲在卡片上,解決了不同醫(yī)院的就診信息無法共享的問題。
【關(guān)鍵詞】? ? 智能卡? ? 病歷存儲系統(tǒng)? ? DES算法
引言:
為了解決資源配置不均衡問題,我國一直積極推進分級診療服務(wù)體系建設(shè)。當(dāng)前不同醫(yī)院的病歷系統(tǒng)并不相通,患者轉(zhuǎn)診后,早期的病歷信息并不能被當(dāng)前醫(yī)院獲取。如何使患者的病歷信息在不同醫(yī)院之間正常共享,成為了醫(yī)療行業(yè)急需解決的問題。
一、智能卡工作原理
本文中智能卡是指內(nèi)部有微處理器芯片(CPU)、工作存儲器(RAM)、程序存儲器(ROM)、數(shù)據(jù)存儲器(EEPROM,F(xiàn)LASH等)和串行通信單元等模塊,這些模塊集成在一塊集成電路中,保證安全性。智能卡即可以是支持7816的接觸式卡,又可以是支持14443的非接觸卡,也可以是兩者都支持的雙界面卡。
1.1文件系統(tǒng)
數(shù)據(jù)在智能卡內(nèi)部以文件的形式組織,智能卡的文件系統(tǒng)要實現(xiàn)的主要功能包括:空間的管理維護;數(shù)據(jù)的有效存儲;數(shù)據(jù)的查找和定位;數(shù)據(jù)的修改和維護。智能卡內(nèi)部樹狀文件系統(tǒng)結(jié)構(gòu)如圖1,卡內(nèi)的文件分為3種不同的類型,其中:MF為主文件,ADF為應(yīng)用文件,EF為基本數(shù)據(jù)文件。
1.2通信協(xié)議
終端設(shè)備和智能卡之間的通信過程都是基于命令/響應(yīng)的方式處理,遵循ISO/IEC 7816-4協(xié)議。終端發(fā)送一條命令給智能卡(命令A(yù)PDU),卡片處理完畢產(chǎn)生一個應(yīng)答回送給終端(響應(yīng)APDU)。在接到一條命令前,卡不會主動傳送數(shù)據(jù)。命令A(yù)PDU由4字節(jié)長的必備頭后跟一個可變長的命令數(shù)據(jù)域組成。響應(yīng)APDU由返回的數(shù)據(jù)域和兩字節(jié)的狀態(tài)字組成。
二、門診病歷存儲系統(tǒng)設(shè)計
2.1文件系統(tǒng)設(shè)計
為更好的和已經(jīng)發(fā)行的社???、醫(yī)院診療卡兼容,本存儲系統(tǒng)被設(shè)計成主文件下一個獨立應(yīng)用文件目錄(ADF)和卡上已經(jīng)存在的其他應(yīng)用共存。ADF下的基本文件包括:
(1)key文件:用于存放安全控制的密鑰,個人化完成后不允許讀取或更改;
(2)EF01文件,用于存放卡片基本信息,如卡片狀態(tài)、發(fā)卡方標(biāo)識、應(yīng)用類型標(biāo)識、應(yīng)用序列號等。經(jīng)過安全認(rèn)證后可以讀取和更新;
(3)EF02文件,用于存放持卡人基本信息,如姓名、身份號、性別、年齡等。經(jīng)過安全認(rèn)證后可以讀取和更新;
(4)EF03文件,循環(huán)記錄文件,用于記錄32條病歷索引信息,和32個病歷文件一一對應(yīng),每條記錄包括就診時間、就診單位、對應(yīng)病歷文件地址等信息。經(jīng)過安全認(rèn)證后可以讀取,系統(tǒng)自動更新;
(5)病歷數(shù)據(jù)區(qū):整個數(shù)據(jù)區(qū)占用空間為1M Bytes,劃分為32個病歷文件,每個病歷文件為32K Bytes,用于存放單次門診就醫(yī)信息。病歷文件由文件頭和病歷信息組成,文件頭用于存放病歷文件長度和每個病歷組成部分的信息長度。經(jīng)過安全認(rèn)證后可以讀取和更新。病歷文件數(shù)據(jù)格式:病歷總長度(2字節(jié))+基本信息長度(2字節(jié))+主訴信息長度(2字節(jié))+現(xiàn)病史部分信息長度(2字節(jié))+查體情況信息長度(2字節(jié))+中醫(yī)診斷信息長度(2字節(jié))+西醫(yī)診斷信息長度(2字節(jié))+診療意見信息長度(2字節(jié))+基本信息(不定長)+主訴(不定長)+現(xiàn)病史(不定長)+查體情況(不定長)+中醫(yī)診斷(不定長)+西醫(yī)診斷(不定長)+診療意見(不定長)。
2.2 安全機制
發(fā)卡人根據(jù)自身的主密鑰和每張智能卡的卡片序列號分散出本張卡片的子密鑰(8 Bytes),在個人化過程中裝載到key文件中,key文件裝載后不允許讀取或更改。在卡片工作過程中,終端和卡片根據(jù)隨機數(shù)(8 Bytes),從子密鑰派生出相應(yīng)的過程密鑰(8 Bytes),用來加密報文數(shù)據(jù)和產(chǎn)生報文的鑒別碼(MAC)。本系統(tǒng)中密鑰分散、加密數(shù)據(jù)、產(chǎn)生報文的鑒別碼(MAC)均使用基于64位分組的DES加密算法。
產(chǎn)生報文鑒別碼的方法:由APDU 命令的所有元素(包括命令頭)產(chǎn)生。(1)以‘0x1111111111111111為初始變量;(2)按照CLA、INS、P1、P2、Lc、命令數(shù)據(jù)域的順序,串聯(lián)形成一個長數(shù)據(jù)塊;(3)將該長數(shù)據(jù)塊分成多個8字節(jié)的短數(shù)據(jù)塊;(4)如果最后一個短數(shù)據(jù)塊的長度不足8字節(jié),則在后邊加上‘0xFF,如果此時達到8字節(jié)長度,則轉(zhuǎn)入(5),否則繼續(xù)添加‘0x11,直至該短數(shù)據(jù)塊為8字節(jié);(5)對重組后的數(shù)據(jù)塊使用子密鑰派生出的過程密鑰,進行64位分組的DES 鏈?zhǔn)郊用?(6)從加密后的最后數(shù)據(jù)塊結(jié)果左側(cè),取4字節(jié)為本報文的鑒別碼。
報文數(shù)據(jù)可靠性要求對明文數(shù)據(jù)進行加密:(1)用1個字節(jié)表示數(shù)據(jù)的長度,放在原數(shù)據(jù)塊的最前面,數(shù)據(jù)重組為:明文數(shù)據(jù)的長度(1字節(jié))+明文數(shù)據(jù);(2)將第(1)步中生成的長數(shù)據(jù)塊分成多個8字節(jié)的短數(shù)據(jù)塊;(3)如果最后一個短數(shù)據(jù)塊為8字節(jié),轉(zhuǎn)入第(4)步;如果不足8字節(jié),在后邊添加‘0xFF;如果長度已達8字節(jié),轉(zhuǎn)入第(4)步;否則續(xù)添加‘0x11,直至該短數(shù)據(jù)塊為8字節(jié);(4)對重新組裝后的數(shù)據(jù)塊使用子密鑰派生出的過程密鑰,進行64位分組的DES 塊式加密;(5)計算結(jié)束后,所有加密后的數(shù)據(jù)塊依照原順序連接在一起??ㄆ蚪K端按照對應(yīng)流程進行解密計算,可以得到原明文數(shù)據(jù)。
2.3 命令設(shè)計
(1)SELECT 命令:通過AID(應(yīng)用標(biāo)識)來選擇IC卡中的ADF,數(shù)據(jù)域為ADF的AID。響應(yīng)數(shù)據(jù)域為8字節(jié)的卡片序列號。
(2)LOAD KEY命令:用于個人化時裝載卡片子密鑰,數(shù)據(jù)域為8字節(jié)子密鑰,裝載完成后卡片不再支持該命令。
(3)GET CHALLENGE 命令:請求一個產(chǎn)生過程密鑰的隨機數(shù)。響應(yīng)報文數(shù)據(jù)域為8字節(jié)隨機數(shù)。
(4)GET DATA命令:如果一條響應(yīng)報文,無法返回所有數(shù)據(jù),需要終端通過GET DATA命令獲取剩余信息。
(5)READ BINARY 命令:用于讀取二進制文件的內(nèi)容(或部分內(nèi)容),數(shù)據(jù)域為報文MAC。返回數(shù)據(jù)為密文的文件信息。
(6)UPDATE BINARY 命令:用于更新二進制文件的內(nèi)容,數(shù)據(jù)域為密文數(shù)據(jù)+MAC。
(7)READ RECORD 命令:用于讀取循環(huán)記錄文件,數(shù)據(jù)域為報文MAC。返回數(shù)據(jù)為密文的文件信息。
(8)READ CASE命令:用于讀取病歷文件,數(shù)據(jù)域包括需要讀取病歷文件的位置(2字節(jié))+數(shù)據(jù)長度(2字節(jié))+報文MAC(4字節(jié))。返回數(shù)據(jù)為密文的文件信息。如果一條響應(yīng)報文,無法返回所有數(shù)據(jù),需要終端通過GET DATA命令獲取剩余信息。
(9)UPDATE BINARY 命令:用于更新病歷文件,數(shù)據(jù)域為密文+MAC;原明文包含需要更新病歷文件的位置(2字節(jié))+數(shù)據(jù)長度(2字節(jié))+需更新信息。
三、卡片工作流程
3.1個人化
終端通過Select 命令選中ADF后,如果卡片返回的響應(yīng)數(shù)據(jù)為初始數(shù)據(jù)8字節(jié)‘FF,則表示該卡片為從未使用過的空白卡,可以對卡片進行個人化。使用load key 命令將分散的子密鑰寫入卡片中。然后根據(jù)GET CHALLENGE命令返回的隨機數(shù)計算出過程密鑰,并通過符合安全機制的update Binary指令將該卡片的其他個人化數(shù)據(jù)寫入EF01、EF02文件,從而完成個人化。
3.2病歷信息讀取流程
通過符合安全機制的READ RECORD 指令獲取本卡片的病歷信息索引,根據(jù)索引信息終端選擇需要讀取的病歷文件的具體內(nèi)容。使用READ CASE命令讀取病歷文件,如果一條響應(yīng)報文,無法返回所有數(shù)據(jù),卡片通過響應(yīng)狀態(tài)字提示終端,終端則通過GET DATA命令獲取下一條響應(yīng)信息,直至所有響應(yīng)數(shù)據(jù)全部獲取完畢。所有響應(yīng)數(shù)據(jù)都是根據(jù)2.2的方法加密后的數(shù)據(jù)。
3.3病歷信息寫入流程
通過符合安全機制的READ RECORD 指令獲取本卡片的病歷信息索引,根據(jù)索引信息終端選擇需要更新的病歷文件的具體內(nèi)容。使用UPDATE CASE命令更新病歷文件,通過命令P1,P2來標(biāo)識本次更新一共有多少條指令,本條為第幾條指令。卡片為本流程設(shè)置數(shù)據(jù)緩沖區(qū),保障所有更新指令全部成功執(zhí)行,或任何一條指令也沒有執(zhí)行。防止因為卡片意外掉電引起的數(shù)據(jù)混亂。更新成功后,卡片自動更新該病例文件對應(yīng)的EF03文件中的記錄。
四、結(jié)束語
本文首先對智能卡應(yīng)用原理進行了介紹,提出了基于智能卡的門診病歷存儲文件系統(tǒng)設(shè)計,可以方便快捷的將患者的病歷信息存儲在卡片上。為了防止終端與卡片的通信過程被惡意第三方監(jiān)聽或篡改,本文提出保護報文數(shù)據(jù)可靠性和完整性的安全機制,避免泄露患者信息。本文提出的設(shè)計可以有效解決在智能卡上存儲門診病歷信息的問題。
參? 考? 文? 獻
[1] ISO/CEI 7816:2006
[2]中國人民銀行 中國金融集成電路(IC)卡電子錢包電子存折卡片規(guī)范(V0.8-20080325)
[3] ISO 16609-2012
[4]朱錚濤,曾江翔.基于網(wǎng)絡(luò)實現(xiàn)SIM卡信息寫入的控制系統(tǒng)設(shè)計.計算機工程設(shè)計.2009.30