胡海瑞 李业芹 厉菲菲
【摘要】 智能卡已经在医疗行业得到了广泛的应用,但主要用于对患者进行身份识别,卡片并不存儲关键就诊信息,使得不同医院之间的就诊信息并不能共享。本文提出了基于智能卡的门诊病历存储的文件系统设计和安全访问控制机制,使得患者的病历信息可以安全的存储在卡片上,解决了不同医院的就诊信息无法共享的问题。
【关键词】 智能卡 病历存储系统 DES算法
引言:
为了解决资源配置不均衡问题,我国一直积极推进分级诊疗服务体系建设。当前不同医院的病历系统并不相通,患者转诊后,早期的病历信息并不能被当前医院获取。如何使患者的病历信息在不同医院之间正常共享,成为了医疗行业急需解决的问题。
一、智能卡工作原理
本文中智能卡是指内部有微处理器芯片(CPU)、工作存储器(RAM)、程序存储器(ROM)、数据存储器(EEPROM,FLASH等)和串行通信单元等模块,这些模块集成在一块集成电路中,保证安全性。智能卡即可以是支持7816的接触式卡,又可以是支持14443的非接触卡,也可以是两者都支持的双界面卡。
1.1文件系统
数据在智能卡内部以文件的形式组织,智能卡的文件系统要实现的主要功能包括:空间的管理维护;数据的有效存储;数据的查找和定位;数据的修改和维护。智能卡内部树状文件系统结构如图1,卡内的文件分为3种不同的类型,其中:MF为主文件,ADF为应用文件,EF为基本数据文件。
1.2通信协议
终端设备和智能卡之间的通信过程都是基于命令/响应的方式处理,遵循ISO/IEC 7816-4协议。终端发送一条命令给智能卡(命令APDU),卡片处理完毕产生一个应答回送给终端(响应APDU)。在接到一条命令前,卡不会主动传送数据。命令APDU由4字节长的必备头后跟一个可变长的命令数据域组成。响应APDU由返回的数据域和两字节的状态字组成。
二、门诊病历存储系统设计
2.1文件系统设计
为更好的和已经发行的社保卡、医院诊疗卡兼容,本存储系统被设计成主文件下一个独立应用文件目录(ADF)和卡上已经存在的其他应用共存。ADF下的基本文件包括:
(1)key文件:用于存放安全控制的密钥,个人化完成后不允许读取或更改;
(2)EF01文件,用于存放卡片基本信息,如卡片状态、发卡方标识、应用类型标识、应用序列号等。经过安全认证后可以读取和更新;
(3)EF02文件,用于存放持卡人基本信息,如姓名、身份号、性别、年龄等。经过安全认证后可以读取和更新;
(4)EF03文件,循环记录文件,用于记录32条病历索引信息,和32个病历文件一一对应,每条记录包括就诊时间、就诊单位、对应病历文件地址等信息。经过安全认证后可以读取,系统自动更新;
(5)病历数据区:整个数据区占用空间为1M Bytes,划分为32个病历文件,每个病历文件为32K Bytes,用于存放单次门诊就医信息。病历文件由文件头和病历信息组成,文件头用于存放病历文件长度和每个病历组成部分的信息长度。经过安全认证后可以读取和更新。病历文件数据格式:病历总长度(2字节)+基本信息长度(2字节)+主诉信息长度(2字节)+现病史部分信息长度(2字节)+查体情况信息长度(2字节)+中医诊断信息长度(2字节)+西医诊断信息长度(2字节)+诊疗意见信息长度(2字节)+基本信息(不定长)+主诉(不定长)+现病史(不定长)+查体情况(不定长)+中医诊断(不定长)+西医诊断(不定长)+诊疗意见(不定长)。
2.2 安全机制
发卡人根据自身的主密钥和每张智能卡的卡片序列号分散出本张卡片的子密钥(8 Bytes),在个人化过程中装载到key文件中,key文件装载后不允许读取或更改。在卡片工作过程中,终端和卡片根据随机数(8 Bytes),从子密钥派生出相应的过程密钥(8 Bytes),用来加密报文数据和产生报文的鉴别码(MAC)。本系统中密钥分散、加密数据、产生报文的鉴别码(MAC)均使用基于64位分组的DES加密算法。
产生报文鉴别码的方法:由APDU 命令的所有元素(包括命令头)产生。(1)以‘0x1111111111111111为初始变量;(2)按照CLA、INS、P1、P2、Lc、命令数据域的顺序,串联形成一个长数据块;(3)将该长数据块分成多个8字节的短数据块;(4)如果最后一个短数据块的长度不足8字节,则在后边加上‘0xFF,如果此时达到8字节长度,则转入(5),否则继续添加‘0x11,直至该短数据块为8字节;(5)对重组后的数据块使用子密钥派生出的过程密钥,进行64位分组的DES 链式加密;(6)从加密后的最后数据块结果左侧,取4字节为本报文的鉴别码。
报文数据可靠性要求对明文数据进行加密:(1)用1个字节表示数据的长度,放在原数据块的最前面,数据重组为:明文数据的长度(1字节)+明文数据;(2)将第(1)步中生成的长数据块分成多个8字节的短数据块;(3)如果最后一个短数据块为8字节,转入第(4)步;如果不足8字节,在后边添加‘0xFF;如果长度已达8字节,转入第(4)步;否则续添加‘0x11,直至该短数据块为8字节;(4)对重新组装后的数据块使用子密钥派生出的过程密钥,进行64位分组的DES 块式加密;(5)计算结束后,所有加密后的数据块依照原顺序连接在一起。卡片或终端按照对应流程进行解密计算,可以得到原明文数据。
2.3 命令设计
(1)SELECT 命令:通过AID(应用标识)来选择IC卡中的ADF,数据域为ADF的AID。响应数据域为8字节的卡片序列号。
(2)LOAD KEY命令:用于个人化时装载卡片子密钥,数据域为8字节子密钥,装载完成后卡片不再支持该命令。
(3)GET CHALLENGE 命令:请求一个产生过程密钥的随机数。响应报文数据域为8字节随机数。
(4)GET DATA命令:如果一条响应报文,无法返回所有数据,需要终端通过GET DATA命令获取剩余信息。
(5)READ BINARY 命令:用于读取二进制文件的内容(或部分内容),数据域为报文MAC。返回数据为密文的文件信息。
(6)UPDATE BINARY 命令:用于更新二进制文件的内容,数据域为密文数据+MAC。
(7)READ RECORD 命令:用于读取循环记录文件,数据域为报文MAC。返回数据为密文的文件信息。
(8)READ CASE命令:用于读取病历文件,数据域包括需要讀取病历文件的位置(2字节)+数据长度(2字节)+报文MAC(4字节)。返回数据为密文的文件信息。如果一条响应报文,无法返回所有数据,需要终端通过GET DATA命令获取剩余信息。
(9)UPDATE BINARY 命令:用于更新病历文件,数据域为密文+MAC;原明文包含需要更新病历文件的位置(2字节)+数据长度(2字节)+需更新信息。
三、卡片工作流程
3.1个人化
终端通过Select 命令选中ADF后,如果卡片返回的响应数据为初始数据8字节‘FF,则表示该卡片为从未使用过的空白卡,可以对卡片进行个人化。使用load key 命令将分散的子密钥写入卡片中。然后根据GET CHALLENGE命令返回的随机数计算出过程密钥,并通过符合安全机制的update Binary指令将该卡片的其他个人化数据写入EF01、EF02文件,从而完成个人化。
3.2病历信息读取流程
通过符合安全机制的READ RECORD 指令获取本卡片的病历信息索引,根据索引信息终端选择需要读取的病历文件的具体内容。使用READ CASE命令读取病历文件,如果一条响应报文,无法返回所有数据,卡片通过响应状态字提示终端,终端则通过GET DATA命令获取下一条响应信息,直至所有响应数据全部获取完毕。所有响应数据都是根据2.2的方法加密后的数据。
3.3病历信息写入流程
通过符合安全机制的READ RECORD 指令获取本卡片的病历信息索引,根据索引信息终端选择需要更新的病历文件的具体内容。使用UPDATE CASE命令更新病历文件,通过命令P1,P2来标识本次更新一共有多少条指令,本条为第几条指令。卡片为本流程设置数据缓冲区,保障所有更新指令全部成功执行,或任何一条指令也没有执行。防止因为卡片意外掉电引起的数据混乱。更新成功后,卡片自动更新该病例文件对应的EF03文件中的记录。
四、结束语
本文首先对智能卡应用原理进行了介绍,提出了基于智能卡的门诊病历存储文件系统设计,可以方便快捷的将患者的病历信息存储在卡片上。为了防止终端与卡片的通信过程被恶意第三方监听或篡改,本文提出保护报文数据可靠性和完整性的安全机制,避免泄露患者信息。本文提出的设计可以有效解决在智能卡上存储门诊病历信息的问题。
参 考 文 献
[1] ISO/CEI 7816:2006
[2]中国人民银行 中国金融集成电路(IC)卡电子钱包电子存折卡片规范(V0.8-20080325)
[3] ISO 16609-2012
[4]朱铮涛,曾江翔.基于网络实现SIM卡信息写入的控制系统设计.计算机工程设计.2009.30