Mifare 是最常用的射频卡,具体介绍网上太多,我就不说了.,很多城市的最早的地铁公交卡都是用这种卡,后来被破解后都换成智能卡了.
但是由于技术成熟,使用方便,成本低,现在很多小区门禁卡,停车卡,食堂饭卡,包括很多医院的就诊卡都用的这种卡.


简单介绍下,一张卡就好像一张白纸,S50有16个分区,每一个分区可以设置单独的两个密码KeyA和KeyB. 而KeyA是永远不能读的, KeyB在默认情况下是可以读到的.
.(简单可以这样理解, 注意,每个扇区可以设置KeyA和KeyB独立的访问条件)

而分区1比较特殊,分区1的第一段写着卡的硬件ID,这个是出厂时就写进去了,不能更改,并且全球唯一(当然这只是约定). 淘宝上有UID白卡, 这种卡可以给分区1写入任意的硬件ID.

08年的时候,发现卡漏洞,这种卡已经很容易被破解, 网上买个读卡器 ACCR122U (一百多)就可以破解.
大概的破解原理是因为这种卡不能产生随机数.而用上位机控制随机数的产生来破解..
但是如果是全扇区加密的卡(就是16个分区都加密) ,那么需要使用Proxmark破解,淘宝居然二三百..

推荐软件 (mifare classic tool) 这个软件使用Android也可以破解, 使用的是穷举方式.
https://github.com/ikarus23/MifareClassicTool


问题: 既然这种卡已经被破解,也就是写什么别人也能看得到,但是我们还必须用这种卡,那么我们如何存储数据并且防止被破解?

设计要求:
我们是一家连锁店,,使用mifare卡作为用户标识卡...
1, 防止更改卡内数据(如卡号,信息等)
2, 防止卡被复制.
3,防止第三方制作卡(我们的系统以后可能会有加盟商,不能让加盟商自己私自买新卡用我们的系统.,需要通过我们这里制作.)
4,保证稳定,快速的读取,并且易于量产加密重置等.(需要单独写一个卡批量加密工具,用于量产.)

网上大都是Mifare的介绍或者如何破解等...不知道别人是如何设计的...
所以在这里写一下自己的思路..

卡内只保存卡号, 不保存任何金额等其他信息.要求与实体卡上印的卡号一致.

将卡号加密后,存储到指定分区M中,并且设置分区密码为固定密码 MA 和 MB..
根据卡号(+硬件ID) 生成对应卡号的校验数据K.(或者根据算法生成).
使用固定密码 NA 作为密匙A,
读取卡硬件ID,使用加密算法 Fun(ID) 计算出16位密码NB.

将校验数据K存入分区N中,并且使用NA和NB作为分区密码..

将其他分区使用固定的密码全部填入随机的垃圾数据,
写卡完成..

读卡时,只使用密码B读取,(只给客户端下发KeyB的密码,更安全.)
使用密码MB读取分区M ,获取卡号,
读取硬件ID,计算校验分区N的密码NB.读取校验信息.
(根据情况操作,可在客户端确认,如何客户端不可信,需要在服务端确认..)获取校验信息,通过服务端确认卡校验信息是否有效,或者通过服务端解密卡ID..

总结:
虽软卡硬件被破解了,写什么都看得见..当然完全可以通过软件算法来防止卡被进一步破解更改数据...
卡上写的信息越少越安全,只在卡上写卡号,不储存用户信息金额等.

当然校验信息需要和校验每张卡独有的硬件ID绑定.来防止卡被复制..
但是网上有可写UID的白卡,就是可以在不破解算法的情况下完全复制..(我们小区的门禁卡我就复制了好几张,不然去物业办一张十块.)
这个时候只能人为的控制,比如消费或者退卡的时候,前台需要确认卡上的标识,或者确认人员信息等.
(有的医院退卡需要缴费清单)

这个用了不到两个星期来设计并完成.目前已经稳定工作了两年,写了大概十几万张卡..
中途碰到过公司采购一批小厂商生产的垃圾卡,上万张卡的KeyB坏掉了,不能读取..只能通过改程序来兼容..

写出来做个笔记, 只是不晓得别人是怎么设计的....

使用Mifare卡加密数据 笔记的更多相关文章

  1. ID卡学习笔记

    前言: 我也来篇关于当时学习ID卡的笔记.前段时间小区装门禁.一个钮扣型的ID卡就要30块.非常黑心.因为其ID卡的成本也就是1块钱以下.因此我也加入到这方面的研究.用来模拟ID卡的T5557卡成本2 ...

  2. 开发企业微信打卡API笔记

    获取企业微信打开API上面的数据 根据企业ID和打卡模块的secret获取access_token 打卡传参body为json格式的字符传 创建打卡对象把参数写入,useridlist为list格式. ...

  3. SD卡学习笔记

    最近调试了SD卡,遇到了一些小问题,记录一下,分享一下. 1.    SD卡 卡槽旁边的一个小开关 我们平时见过的SD卡都是小的SD卡,可以放在手机上的.现在大多数的开发板上也是小的SD卡的卡槽,插入 ...

  4. [SD卡] FPGA笔记之SD卡

    1.数据怎么存进去的? 其中的sd_miso就是接收的1位数据,n个时钟下就收到n个数据,比如n=21. 2.如何做到先发送高位?

  5. MIFARE系列3《卡能源和数据传递》

    在MIFARE卡中,能量和数据通过天线传输,卡中天线为几匝线圈,直接连接到芯片上,不再需要额外的组件.线圈嵌入塑料中,形成了一个无源的非接触卡. 读卡器向IC发一组固定频率的电磁波,卡内有一个IC串联 ...

  6. 破解简单Mifare射频卡密钥杂记

    先要了解一点大学城浴卡用的是什么卡,经查证是Mifare S50卡,也有叫ISO14443A的(协议名).本来想看看大学城浴卡有没有安全漏洞,没想到浴卡公司在安全性上几乎是蔑视我们大学生的智商,虽然被 ...

  7. 由Mifare 1卡破解带来的危险以及应对方法

    今年年初以来,一个消息的传出震惊了整个IC卡行业.最近,德国和美国的研究人员成功地破解了NXP的Mifare1芯片的安全算法.Mifare1芯片主要用于门禁系统访问控制卡,以及一些小额支付卡,应用范围 ...

  8. RFID-RC522、FM1702SL、M1卡初探

    catalogue . 引言 . RC522芯片(读卡器)简介 . FM1702SL芯片(读卡器)简介 . RFID M1卡简介 . 读取ID/序列号(arduino uno.MFRC522芯片 Ba ...

  9. Mifare系列7-安全性(转)

    文/闫鑫原创转载请注明出处http://blog.csdn.net/yxstars/article/details/38087245 飞利浦的MIFARE卡 由于它的高安全性在市场上得到广泛应用,比如 ...

随机推荐

  1. FFmpeg-音频和视频应用程序的瑞士军刀

    FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件).它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/视频编解码库l ...

  2. 程序bug致损失400亿,判程序员坐牢? 搞笑我们是认真的

    号外!号外!走过,路过,不要错过!日本 IT 业的狗血八卦继续独家放送啦!! 2015 年 9 月 3 日,随着东京最高法院驳回瑞穗证券的上诉,维持二审的原判结果,一个长达 10 年的诉讼终于画下了句 ...

  3. stm32开发之标准库的介绍

    1 STM32标准外设库概述 STM32标准外设库之前的版本也称固件函数库或简称固件库,是一个固件函数包,它由程序.数据结构和宏组成,包括了微控制器所有外设的性能特征.该函数库还包括每一个外设的驱动描 ...

  4. touch.js下载使用方式

    touch.js下载地址 https://gitee.com/mirrors/touch-js Touch 在开发移动端的应用中会使用到很多的手势操作,例如一指拖动.两指旋转等等,为了方便开放者快速集 ...

  5. dependencies 与 devDependencies 的区别

    dependencies 与 devDependencies 的区别 在使用 npm install 安装 npm 包时,有两种命令参数可以把它们的信息写入 package.json 文件: --sa ...

  6. SpringMVC国际化支持

    这周公司领导希望我对一个项目,出一个国际化的解决方案,研究两个小时,采用了SpringMVC的国际化支持,在此记录下. 原理: 在DispatchServlet中注册localeResolver(区域 ...

  7. .class, class.forName(), getClass()的区别

    类名.class叫做"类字面量",因class是关键字, 所以类名.class编译时确定. getclass()运行时根据实际实例确定,getClass()是动态而且是final的 ...

  8. [APIO2009]会议中心

    [APIO2009]会议中心 题目大意: 原网址与样例戳我! 给定n个区间,询问以下问题: 1.最多能够选择多少个不相交的区间? 2.在第一问的基础上,输出字典序最小的方案. 数据范围:\(n \le ...

  9. Luogu3444:[POI2006]ORK-Ploughing

    题意 见luogu Sol 贪心+枚举 如果知道最后一次是消除一行 那么一定消了\(n\)行 此时只要消的列最小就好了 枚举每列从上往下消到哪里,那么下面消的越小越好 那么就有了贪心策略: 先消左右的 ...

  10. java把集合数据写入txt文档

    List<String> list= bs.findJson(); try { BufferedWriter bw = new BufferedWriter(new FileWriter( ...