背景
在我们生活中经常出门需要携带门禁卡工卡,不是很方便,甚至有时候忘记带,会产生不小的麻烦。这时我们会产生一个小需求,比如我们的手机是否可以模拟门禁卡或工卡,从而让我们摆脱携带实体卡的麻烦呢。
在网上一搜索,发现资料很冗杂,有的人说可以,有点人说不可以,甚至网上有很多三方Android APP,也声称安装后可以实现模拟门禁卡,结果确是失望。或者看到小米手机,华为手机声称可以模拟,结果也是几家欢喜几家愁。
手机是否可以支持模拟门禁卡?
答案是分情况而定的。
首先Apple手机基本不能,因为Apple IOS系统对NFC支持不好。其次系统代码闭源,很少有资料能研究其内部实现。
对于Android手机,答案是视手机硬件条件部分可以。
首先需要自己的Android手机硬件上支持,自己的Android手机除了要有基本的NFC芯片,还需要带有eSE芯片。对于被模拟对象的门禁卡,也需要门禁卡自身是未加密卡,或卡片秘钥有被破解可能的。如果门禁卡秘钥是复杂的无法被破解,那基本也是模拟不成功的。
【另外被模拟的卡片需要为非ID卡,ID卡其射频频率和NFC不同,带NFC功能的Android手机无法读写和模拟ID卡门禁和工卡,这里Android可以模拟的卡片为IC卡】
我们先说手机端的条件。
Android NFC支持的基本能力是读写卡,和基于CPU的主卡模拟(HCE),【NFC P2P能力Android R后已不能使用了因为Android beam已被废弃】,读写卡和HCE这两个能力基本手机厂商声称有NFC功能的手机都支持。还有另两个卡模拟能力,基于UICC的卡模拟和基于eSE的卡模拟能力需要特别硬件支持,不是所有支持NFC的手机都支持。
基于UICC的卡模拟
在我们生活中,有些市政公交公司推出有支持公交卡能力的SIM卡,或有些电信公司推出支持校园食堂刷卡的SIM卡。这类SIM卡使用就需要手机NFC支持基于UICC的卡模拟功能,如果手机不支持,SIM卡就无法完成刷卡。对于这项能力,手机厂商需要把SIM卡槽硬件通过SWP连接NFC芯片。
基于eSE的卡模拟
这就是我们生活中期望的手机模拟门禁卡工卡的基本硬件条件。eSE是手机主板上集成的一个单独的安全芯片,拥有独立的CPU, ROM, RAM。主要用在支付领域。这类芯片一般只有个别手机厂商旗舰机,或把模拟门禁卡作为卖点的手机会有,比如华为,小米,三星个别机型或小米手环4,5...。一般非主流支持NFC的Android手机是不支持的,自然其也无法支持模拟门禁卡。
对于市场上的三方APP声称可以支持模拟门禁卡,基本是假的。其不说模拟卡里面的数据,甚至连基本的卡号模拟都无法做到。
1. 因为没有eSE的NFC手机,只能够使用基于CPU的主卡模拟(HCE),HCE只能模拟基于TypeA, IsoDep, Felica等技术类型的卡,使用HCE且需要刷卡方公司特别配合。比如公交公司,银行,既是发卡方又是读卡终端后台,他们就可以在读卡终端增加新流程和自己公司APP里面的HCE服务配合,最终完成卡模拟读卡和支付。而我们需求的门禁卡模拟,基本是想绕过读卡和发卡方,偷偷进入他们的流程。这样就必须要先知道他们怎么交互的,基于HCE交互流程基本是厂商保密的。2. 其他方面,市场上主流的门禁卡,工卡基本都使用NXP公司的mifare classic卡或相同技术规范的卡,Android 主卡模拟(HCE)目前还不支持模拟mifare classic卡。这样技术上无eSE的手机,使用HCE是无法模拟同类型Mifare门禁卡的,另外Android NFC主卡模拟的UID【通俗可以理解成卡号】是动态随机生成的,而模拟门禁卡的卡号必须是要固定的。这样三方APP基于HCE连模拟门禁卡的卡号都做不到。
前面说了Android NFC手机模拟门禁卡,前提是需要先有eSE的芯片。
那怎么判断自己手机是否有eSE芯片?
1. 可以咨询所购手机品牌的厂商,或看它们手机宣传卖点是否有支持模拟门禁卡。
2. 去手机自带钱包APP 比如华为Pay, 小米Pay看是否有类似功能。如果手机自带钱包APP有类似智能门卡功能,基本上是支持eSE的,接着可以模拟出一张白卡或空白卡,在另一个手机安装NFC Tools PRO apk然后读模拟卡的手机,如果读取的技术列表里面有MifareClassic, 就说明手机硬件上支持模拟门禁卡,反之就高概率不能够成功模拟。
3. 或从下面链接下载安装NFC Test APP,然后点击“1. 获取Nfc使能状态”按钮,如果红框NFC_CARD_EMULATION_ESE为"support" 就说明手机有eSE芯片,如果显示"not support"就说明手机无eSE芯片。
https://download.csdn.net/download/scyangwei/89281045?spm=1001.2014.3001.5503
eSE是独立的安全芯片,不是所有三方APP都可以直接访问,eSE里面的applet有独特的访问控制策略,比如保存有可以访问它们的APP的签名,所以通常来说只有手机厂商或厂商允许的APP可以访问手机的eSE。举个例子,小米Pay有模拟门禁卡功能,但它安装华为手机不一定可用。因为它没有权限访问到华为手机的eSE芯片。同理,在带有eSE的Android手机,三方APP也很难有能力完成模拟门禁卡,即使提示模拟成功,实际也很难刷卡成功。
当确认了自己的手机支持NFC,也有模拟门禁卡的eSE芯片。下一步,就需要确认自己的门禁卡是否是加密的,或是可以简单破解的门禁卡。因为Android手机,无论华为,小米支持直接复制的门禁卡都是没有加密的。对于加密卡,个别设备会直接提示不支持复制和模拟。个别手机其钱包APP,比如小米钱包集成有小容量的密钥库。复制加密卡时会尝试用自己的秘钥库破解,如果成功破解,就可以成功完成复制卡。如果自己密钥库无匹配秘钥,无法成功破解卡片秘钥,此时手机只能复制到加密卡的UID即卡号,但无加密数据的手机复制门卡通常是无法成功刷们的。
如何判断我们门禁卡是否加密的?
可以网上下载Mifare classic Tools APP。【读卡时需要选中左下图红框中两个密钥库,这两个密钥库包含了1800条常见Mifare秘钥】
1. 如果该APP读取你们门禁卡,密码区全是FFFFFFFFFFFF【如右下图每个扇区第四块前后密码区都是FFFFFFFFFFFF】,那说明你们门禁卡是未加密的,可以直接手机模拟。
2. 如果密钥区有完整的密钥数字,说明已破解密钥【比如我门禁卡第14扇区秘钥A破解为112233445566,其他扇区秘钥A,B都为FFFFFFFFFFFF,说明我门禁卡的14扇区加密了,其他扇区没有加密】,可以支持模拟但需要特殊操作,a. 个别支持直接复制加密门禁卡的手机,需要参考下文三星手机复制门禁卡步骤进行操作,针对小米手环等不支持直接复制加密门禁卡的设备,需要网上购买单独CUID卡特殊配合才能成功。】
3. 如果密钥区如下图全是"------------",或总是提示“未发现密钥(或死扇区)",那不幸,你的门禁卡密钥比较复杂,Mifare Classic Tools 1密钥库1800条秘钥中没有匹配到你卡片的密钥,下一步,需要使用包含更多秘钥库的NFC Test APP去破解密钥,请参考我下面另一个博客,使用NFC Test APP去尝试破解。
如果MifareClassicTool APP和NFC Test APP都无法成功破解。下一步,花钱去买些其他专业工具比如acr122u或PM3工具破解可能会提高破解概率,但非专业或不是特别迫切不建议,因为一是成本超过100+,二是很大概率还是破解不了。
下面,我以两个实际案例,讲解一下加密门禁卡复制模拟过程。
案例1:小米手环5复制加密门禁卡
本案例适用于手机或穿戴设备完全无法复制加密门禁卡的情况。
门禁卡的复制,分为两个过程,一复制卡的UID即卡号,二,写入加密数据。
准备条件:
1. 淘宝上花了13元钱买了10张CUID 卡【标准的Mifare classic是无法修改卡号的,只有这类UID卡可以修改卡号】。
2. 一个支持NFC功能的Android 手机。并安装了Mifare classic Tools APP。
2. 支持NFC功能的小米手环5。手环5 NFC硬件是NXP pn80T芯片,自带有eSE芯片。
操作步骤:
1. 使用手机Mifare classic Tools APP读取加密门禁卡。选中红框两个秘钥库后读卡。
2. 在Mifare classic Tools编辑读取数据,把加密区密码修改为FFFFFFFFFFFF。比如下图把112233445566修改为FFFFFFFFFFFF,接着保存修改。
3. 把修改后的数据写入CUID卡。注意,写卡时必须选中“高级开启块0写入”选项才会覆盖写入门禁的卡号。
4. 用小米手环复制未加密的CUID卡。这一步主要是复制门禁卡卡号。
5. 在Mifare classic Tools编辑之前读取数据。把加密区的密码修改为原来破解的密码。如下图把FFFFFFFFFFFF手动修改为以前的秘钥112233445566.
6. 使用Mifare classic Tools把带加密数据的内容写入小米手环。写入时不要选中“高级开启块0写入”。(这一步使用的是NFC写卡功能)
自此,门禁卡复制完成。这时应该小米手环内的数据和门禁卡完全一样,包括卡ID,加密数据,及密码区。
案例2:三星S9,S22 复制加密门禁卡
本案例适用于能直接复制加密门禁卡的手机,但因手机无法成功破解卡片秘钥,导致仅复制到卡片UID,刷卡无法生效的场景。
准备条件:
1. 一台支持NFC的Android手机,安装NFC Test APP, 用于完成加密门卡的秘钥破解及把加密数据写入三星S9/S22手机复制的门禁卡中。
2. 一台三星S9或S22,用于复制门禁卡。
操作步骤:
1. 打开自己手机自带的钱包APP,我这里是三星钱包,然后进行基本设置后,进入智能门卡设置的菜单页面。
2. 点击智能门卡菜单,并开始添加智能门卡流程。同意APP内的条款和条件后点击开始。
3. 手机背面贴需要复制的门禁卡或工卡,此时会提示加密卡复制后可能无法正常使用,点击确认并开始复制。由于卡片复制过程中会包含卡片秘钥的破解,手机厂商钱包APP自带的密钥库比较小,可能无法成功破解卡片秘钥,而导致无法复制到加密数据,最终仅复制到卡片UID。门禁卡和工卡仅复制到卡片UID而无加密数据及秘钥,通常是无法成功刷卡的。
4. 手机首次完成卡片复制后,接着手机上把卡片功能打开,用MifareClassicTool或NFC Test APP读取手机数据。可以发现手机上复制的门卡仅UID和卡片相同,其他扇区的秘钥及数据都是默认数据。说明没有复制到卡片数据。红框中0000000都是默认数据及FFFFFFFFFFFF是默认密钥。
5. 手机复制完卡片UID后,下一步就是需要成功破解卡片秘钥,及向卡片写入加密数据及秘钥。
关于卡片秘钥的破解,请参考前文使用MifareClassTool及NFC Test APP破解卡片秘钥的步骤操作,破解成功后保存卡片秘钥。如下图我前面破解成功的秘钥保存为my.keys, 此时选中,接着读取加密门禁卡。并读取到卡片加密数据及秘钥。
6. 在NFC Test APP右上角菜单单击“保存”以把dump文件保存到本地,接着点击“写转储”按钮以把新读取的加密数据及秘钥写入到手机复制的卡片中。
7. 三星S9打开刚刚添加的门卡,接着把手机贴近另一个写卡APP的手机,完成数据写入。写入完成后,用另一个手机再次读取三星S9的门卡,该门卡此时应该已有加密数据和密钥,之后去刷小区门禁,应该可以成功刷开门。
自此,手机复制加密门卡流程完成,成功后手机门卡应该和实际门禁卡卡号和卡内加密数据及秘钥完全相同。
是否可以手环或手机手机创建一个白卡,然后使用Mifare Classic Tool直接写数据到白卡?
答案是NO, 秘钥和加密数据可以写入,但卡号无法直接覆盖写入白卡。因为NFC联盟对这类卡的卡号定义出厂即固定,卡号全球唯一。可以修改卡号的卡是中国卡商自己弄出来的,称为中国魔术卡,不是通用标准卡。
门禁卡读卡过程,一般会先验证卡号,之后门禁卡会使用自己的秘钥加密随机数并发送给读卡设备,读卡设备会使用双方都知道的密码对数据进行解码,之后匹配数据。所以通常来说,如果门禁卡无法破解卡内秘钥,单复制门禁卡的卡号是没有什么用的,但不绝对,有些小区可能物业人员对门禁设备后台设置不专业或其他原因,仅验证卡号,这样的门禁卡仅复制卡号就可以,但这样的情况极少见。
有些网上说的手机root后,去修改NFC 配置固定手机uid。这种方法技术难度比较大,首先手机root,大部分人都无法做到,其次需要手机NFC方案是NXP的。NFC芯片供应商除了NXP,还有ST, SEC, 国产有紫光青藤,捷联等等,配置修改方法不通用。就算修改成功。实际使用也仅能绕过仅检查UID的门禁卡系统,这类门禁系统市场上很少很少,检查秘钥的门禁系统就无法使用。
工卡的复制原理和门禁卡一样,只是工卡使用复杂秘钥的情况比较多,即成功概率比复制门禁卡低。另外上面所述的方法也不是100%都可以成功复制后开门,因为有人在研究怎么破解秘钥及复制门禁卡,卡商也在不断研究和推出防复制手段和系统。