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