zoukankan      html  css  js  c++  java
  • 使用Mifare卡加密数据 笔记

    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坏掉了,不能读取..只能通过改程序来兼容..

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

  • 相关阅读:
    SQL学习日志
    程序员之路──如何学习C语言并精通C语言
    using用法
    c#中的接口与类的区别
    用c#来实现一种行列式的计算优化
    python 切换目录
    如何光盘自动运行html?
    nsis 安装脚本示例(转)
    python sys.path.append
    python 面向对象初认识
  • 原文地址:https://www.cnblogs.com/zifeiniu/p/8650732.html
Copyright © 2011-2022 走看看