射频卡的电气特性
1、容量为8Kbit的EEPROM,分为16个扇区,每个扇区分为4块,每块16个字节,以块为存取单位;
2、每个扇区有一组独立的密码和访问控制;
3、每张卡有唯一的32位序列号;
4、具有防冲突机制,支持多卡操作;
5、无电源,自带天线,内含加密控制逻辑和通信逻辑电路;
6、工作温度,-20℃到50℃;
7、工作频率,13.56MHz;
8、通信速率,106Kbit/S;
9、读写距离可达10mm,与读卡器和卡天线尺寸有关;
10、数据保存期为10年,可改写10万次,读不限次数;
控制特性
1、M1卡有16个扇区,每个扇区4块,共64块,按绝对地址编号0到63。其中每一个扇区的前三块为数据块,第四块为控制块。其中数据块编号0,为厂商使用,存放厂商代码,已固化,不可更改。
2、数据块有两种应用,一种是用作一般数据保存,可进行读写操作,另外一种用作数值,可以进行初始化值,加值,减值,读值操作。
3、每个扇区的第三块为控制块,包括了密钥A 六字节,存取控制4字节,密钥B六字节。存取控制决定了数据块和密钥的访问权限。
4、控制字默认为FF078069,其中前三字节决定了数据块的访问权限,第四字节为备用字节,默认值为69。默认密钥A和密钥B均为FFFFFFFFFFFF。
5、控制字在默认状态下,各数据块的访问权限:
前三个数据块的控制均为000(厂商预设的初始值),对应的访问权限均是验证密钥A或是密钥B后,可以对数据块进行读出,写入,加值,减值,初始化操作。
对于控制块来说控制状态为001,对应的访问权限,对于密钥A,无论如何禁止读操作,验证完密钥A或密钥B后可以进行写操作;对于存取控制字,验证完密钥A或是B后可以进行读操作,也可以进行写操作;对于密钥B,验证完密钥A或是密钥B后可以读操作,也可以写操作;
该初始值主要供制卡和发卡商检测芯片功能使用。
6、当控制字为08 77 8F 69时,各块的访问权限:
前三个数据块均为110,权限为:验证密钥A或密钥B后可以读操作,验证密钥B后可以进行写操作,加值操作,验证完密钥A或密钥B可以进行减值或是初始化操作;
对于控制块来说控制状态为011,对于密钥A,无论如何均不可读,验证完密钥B后可以进行写操作,对于控制字,验证完密钥A或是密钥B可以进行读操作,验证完密钥B后,可以进行写操作,对于密钥B,无论如何不可以进行读操作,验证完密钥B后可以进行写操作;
7、按照08 77 8F 69控制字设置后,密钥B不可读,并且改写数据和改写控制位都需要验证它,所以密钥B设置后,程序操作员必须妥善保管密钥B,否则以后改写数据和控制位时,不正确的密钥B,将无法实现卡的任何操作。
最初个扇区块3内的密钥A,密钥B都是厂商12个F默认值,密钥A在任何条件下都不可读,大部分读写机程序表现密钥A为12个0,在修改控制值时,先不要修改默认的密钥A和默认的密钥B,在控制为修改成功后,再去更改新密码值。
第一,先对块3的控制位进行修改(默认值为FF 07 80 69改为新值08 77 8F 69)并执行读写操作。控制位写成功后,密钥B也为12个0不可读了,但仍是隐藏为12个F的默认值。
第二,修改块3的密钥A和密钥B的值,控制字08 77 8F 69值写成功后,验证密钥B成功后,可以改写密钥A和密钥B为新的值。在密钥操作模式写入要改写区块先前的密钥(先前密钥为默认值时,则不需要改动和加载),加载后返回数据操作模式,再进行读值,密钥A和密钥B的值改写;
第三,修改块0到块2中的数据,由新的控制条件08 77 8F 69可知,要修改数据,必须先验证密钥B,所以先设置密钥认证方式为密钥B认证方式,加载后再返回数据操作模式,对要修改的数据块进行值得改写操作;
MF1卡常见的问题以及处理建议
(1)、盲目操作:造成默写区块误操作被锁死,不能再使用。应仔细参考数据块和控制块的权限表,先得出操作后的结果是否适合使用要求,并且列出操作顺序表单再操作。最好授权程序员对块3的设置做专人操作;
(2)、丢失密码:再进行读写时造成密钥认证错误不能访问卡。特别要求再对MF卡进行块3编程操作时,必须及时记录相关卡号的控制值,密钥A,密钥B等,而且应当有专人管理密钥档案;
(3)、错误设置:对MF1卡的块3控制块了解不透彻,错误的理解造成错误的设置,结合控制权限表可知,目前MF1卡的控制块仅有8种数据块访问权限和8种控制块设置权限,超出这16种权限的其他代码组合,将直接引起错误设置而使卡片报废;
(4)、极端权限:当块3的存取控制为C13C23C33=110或是111时,称为极端权限,除特殊应用外一般不被使用。启用前认真权衡对密码读写,存取控制的锁死是否必要,否则,数据加密后即使有密码也无法读取被锁死的数据块(看不见)。
(5)、设备低劣:低劣的设备将直接影响卡的读写性能。对MF卡进行块3的编程操作的设备,特别要求其性能必须十分可靠,运行十分稳定。建议用飞利浦公司原装的读写模块构建的知名读写机具;
(6)、编程干扰:对块3进行编程操作时,不可以有任何的IO口中断或打扰,包括同时运行两个以上程序干扰甚至至PC机不良的开关电源纹波干扰等,否则不成功的写操作将造成某个扇区被锁死的现象,致使该扇区再次访问时出错而报废;
(7)、数据出错:在临界点上读卡和写卡造成的。通常的读卡,特别是写卡,应该避免在临界状态(刚能读卡的距离)读卡。因为临界状态下的数据传输是很不稳定的,容易读写出错;
(8)、人为失误:例如,密码加载操作失误,误将密钥A加载为密钥B,或者是误将其他制卡厂商约定的初始密钥值如A0A1A2A3A4A5,B0B1B2B3B4B5加载到本公司生产的MF1卡内,或者在初始状态下(密钥A=000000000000,隐藏状态,实际为FFFFFFFFFFFF,控制位FF 07 80 69,密钥B=FFFFFFFFFFFF,可见)若不经意地将密钥A=000000000000删除后又重新输入12个0,并加载了它,这时无意中已将密钥A原来隐藏的12个F,改成了12个0,其后果可想而知;
(9)、卡片失效:读写均无数据发送,读卡器报告寻卡错误。卡片被超标扭曲,弯曲而造成内部电路断裂。
(10)、读写距离过近:与用户使用的读写器性能有关。标准型MF1卡的读写距离可达10cm(在飞利浦公司的标准读写机具上测试的最大距离),国产知名品牌读写器一般可达到5到10cm。尺寸较小的匙扣卡,其读写距离当然比标准卡近许多,但只要可靠地读写距离大于等于5mm到10mm以上,一般不会影响使用;
制卡厂商的责任与义务
1、MF1卡相关的控制位的算法与设置,依据飞利浦公司的《Mifare 1 IC S50》的PDF原始文档,本文档仅供客户参考,如有不当之处,应以原始文档为准!客户可重点对照参考第12到15页的原始英文说明;
2、MF1卡芯片电路均采用飞利浦公司原装产品,品质可靠,性能稳定;
3、MF1卡均经过严格的测试,保证出厂的正品率大于等于99.9%;
4、客户在收到MF1卡的90天内,务必尽快使用厂商默认值对卡的所有区块进行读写检测,超期恕不受理;
5、如果在厂商默认状态下(保持控制位存取控制值为FF078069,密钥A=密钥B=FFFFFFFFFFFF)不能正确读写数据,属产品质量问题,请在验收期内尽快与制卡商联系。属制卡工艺引起的,由制卡商负责解决,确属芯片质量引起的,制卡商有义务联系飞利浦公司的相关芯片供应商协调解决;
6、如果客户已经改写了控制位的值(例如将默认值FF078069改写为0877FF69),表明客户已经认可MF1卡的质量,而后出现的操作失误的问题(例如丢失密钥B而不能改写数据块等等),属于客户责任,与供货商产片质量无关;
7、通常,本厂生产的MF1卡内已具有厂商代码和保修代码,客户范会有问题的MF1卡经检测若非本厂卡,首次退换不予解决,在退卡登记名册再次出现非本厂卡,则一律没收,敬请体谅;
8、制卡商可依据客户要求,义务提供飞利浦公司相关《Mifare 1 IC S50》等原始文档(英文PDF文档);
9、本厂技术性文档为订货合同不许附件,客户可以广为散发传播,但必须保证文档的完整和不被修改;
刷卡扣费
刷卡扣费分为两种,一种是联网在线刷卡扣费的,所有的信息通过终端设备连接服务器,数据库,验证除了终端设备对卡进行验证外,服务器也会存储响应的验证信息,所有信息的修改是基于服务器与数据库的,卡的本身只说明了什么信息,例如银行卡。
另外一种是离线扣费的,比如饭卡,公交卡等等,扣费是通过对卡本身的数据区域的内容进行相应的修改,比如对卡的某一个存储块存储的钱的值的修改,然后产生一条数据记录在刷卡的机器上面,并在一定的时间内对刷卡的机器与服务器的数据库进行数据的同步,更新卡的最新消费情况。简单的说是离线消费,在线充值,一张卡在服务器的数据库里面对应一个资金账号,卡的扣费是修改卡本身的内容,卡的充值是同时将服务器和卡本身内的值进行更新,更新至最新的充值后的金额,即卡本身内部剩余的金额加上充费的金额,不存在充值不可靠的情况。而刷卡的机器在一定的时间内去联网同步数据,是为了区分在不同应用的场景,卡的消费情况,便于商家记录自己应得多少钱。类似于校园一卡通,你的卡是离线消费的,去了食堂的不同的窗口买了不同的食物,去了澡堂,去了某一个商店,这些地方定期都将自己的刷卡的机器信息同步到服务器的数据库中,从而从你的账户中获取自己应得的那一部分钱,你的账户也会被扣除相应的金额;
离线时如何按照时间扣费,此时,在主控板上面应有RTC时钟,在刷卡的时候将刷卡的时间,是开始计费还是结束计费的标志写入RFID卡内,当下一次刷卡的时候如果发现RFID卡还没有结束计费,就计算卡消费的时间,这样防止了离线状态下,按时间计费时,别人恶意消费。举例说明:校园刷卡接开水计费,不同的人对开水的需求是不一样的,接开水的量也是不一样的,也就是接开水的时间也是不一样的,开始接水后,将接开水开始的时间写入RFID内,当接水完成后,再刷一次卡,根据时间计费,如果在接开水期间,用户直接走开,不用RFID卡关闭开水,没有关系,当该用户再一次接开水后,尽管在不同的刷卡机器上面,刷卡机在识别到RFID卡后第一件事就是读取卡当前的状态,如果发现卡在之前接水没有结束计费,则先扣除该卡的费用,然后再重新开始计费。
防止恶意补卡
如果用户在某一台设备上拥有一张完好的扣费类卡时,同时又向经销商提出补卡要求,那么用户将会同时拥有两张有效的扣费类卡(第二张卡免费且拥有第一张卡里面的余额),为此,需要在单片机端留有一定的存储空间,如果发现异常情况,则记录相应卡的UID(序列号),防止用户再使用。
具体做法,分出两块存储区域,存储区域1,用于存储有效的卡的UID,其实个人觉得这个存储区域可有可无,因为刷卡后有严格的交互认证,有存储区域2后,只要查询到UID为非挂失UID,且卡又通过了认证,就认为卡是有效的,这样做的目的是如果用户量非常大,对于设备端本身来说,查询有效的UID是很花费时间的,可能用户体验不好,存储区域2,存储挂失的UID,如果是挂失的UID,就不进行任何消费操作,相反如果访问成功,即交互认证后,任何设备端都有权利将该UID的卡进行数据清除操作,消除后其他同类设备无法在访问该UID的卡的数据,如果无法再访问该UID的卡的数据,则在访问到该UID的卡后,在存储区域2内消除该UID,保证不会有过多的UID存储在区域2内,并将存储区域内的最后一个UID填补在被清除的UID的存储位置,同时将最后一个UID的存储位置的内容清除;
如何将挂失的UID更新到存储区域2呢,只有是联网实现了,所以如果挂失了卡,因为终端刷卡设备没有联网,所以终端刷卡设备没有更新挂失的UID,这样在服务器端挂失的卡仍然可以在终端刷卡设备上进行刷卡消费,这样的问题,如何解决,多余出来的消费怎么办,好尴尬啊!以此猜测,校园一卡通的各类刷卡消费的设备不管通过什么通信方式,最终还是将数据汇总后进行实时的网络通信的。比如采用485通信后将数据汇总到某一个设备中心机,然后该主机以网络通信的方式与服务器进行实时的通信;
M1卡的三次相互认证
射频识别系统中由于卡片和读写器并不是固定连接为一个不可分割的整体,所以二者在进行数据通讯前如何确认对方的合法身份就变得非常重要。根据安全级别的要求的不同,有的系统不需要认证对方的身份,例如大多数的TTF模式的卡片;有的系统只需要卡片认证读写器的身份或是读写器认证卡片的身份,称之为单向认证;还有系统不仅卡片要认证读写器的身份,读写器也要认证卡片的身份,这种认证我们称为相互认证。Mifare系列卡片中的认证就是相互认证。
最常见的认证是使用密码或者叫口令,就像特务见面,只要说了口令(密码)就可以确信对方是自己人。直接说口令(密码)存在巨大的风险,万一被别人听到了后果不堪设想,所以最好不要直接说出密码,而是通过某种方式(运算)把密码隐含在一串数据里面,这样不相干的人听到了也不知道是什么意思。为了让隐含着密码的这一串数据没有规律性,对密码运算时一定要有随机数的参加。于是最常见的相互认证就是双方见面时一方给另一方一个随机数,让对方利用密码和约定算法对这个随机数进行运算,如果结果符合预期则认证通过,否则认证通不过。
TCP协议中经过“三次握手”就可以确信双方的连接是成功的。Mifare系列卡片采用的相互认证机制也被称为“三次相互认证”,如下图所示
卡片认证读写器的合法性,先向读写器发送一个随机数,读写器用事先约定的有密码参与的算法对随机数进行运算,然后把运算结果送回给卡片,卡片收到后检查这个结果对不对,如果对就通过认证,不对就没有通过认证,其情形就是上图中的图a;
读写器认证卡片也是向卡片发送一个随机数,卡片用事先约定的有密码参与的算法对随机数进行运算,然后把运算结果送回给读写器,读写器收到后检查这个结果对不对,如果对就通过认证,不对就没有通过认证,其情形就是上图中的图b;
可见卡片与读写器认证对方都是给对方一个随机数,对方返回随机数的运算结果。这样一来一回我们称之为“两次相互认证”。那么卡片与读写器相互认证就需要两个“一来一回”,应该称之为“四次相互认证”才对啊?为什么是“三次相互认证”呢?上图中表现得很明显,读写器在送回对卡片随机数的运算结果时搭了一次便车,把自己认证卡片的随机数也一同送了过去,从而减少了一次数据传送,四次相互认证就变成了三次相互认证;
完整的相互认证过程如下:卡片先向读写器发送一个随机数B,读写器用事先约定的有密码参与的算法对随机数B进行运算,然后再把运算结果连同随机数A一同送给卡片,卡片收到后先检查读写器对随机数B运算的结果对不对,如果不对就不再往下进行,如果正确就对随机数A用事先约定的有密码参与的算法进行运算,然后把运算结果送给读写器,读写器收到后检查这个结果对不对,如果对就通过认证,不对就没有通过认证,其情形就是上图中的图c;
认证的过程中多次提到的“事先约定的算法”,到底是什么样的算法呢?这个没有具体规定,但是有一个要求是必须的,就是这个算法一定要有密码和随机数的参与。比如Desfire中使用的3DES算法,卡片的主密钥作为DES密钥对随机数进行DES运算,双方使用烦人“算法”以及“参加运算的密码”可以相同也可以不同,这要看双方的约定。
认证后随机数也并不是就没有用了,这两个随机数的组合可以最为下一步操作的数据加密密钥,Desfire中就是这样的。