半年前整理钥匙串,我看着手边那张门禁卡,突然想试一个很多人问过的事:把RFID射频卡写进手机NFC,让出门变成只带手机。折腾了大半个月,我确实把一张自己的测试卡“搬”进了手机,也踩了一堆关于频率、加密、卡类型的坑。这篇心路小记不评价破解工具,只讲清楚能用手机NFC做什么、怎么做、什么不能做。适合两类人:一是想把自家门禁卡塞进手机试试的普通用户,二是准备在Android或uni-app上做NFC读取开发的初学者。我会把技术原理、实操步骤、常见问题都按我踩坑的顺序写清楚,尽量说人话。
1. 先分清射频卡的底细:RFID、IC卡与NFC的关系
网上查资料时,最让人头晕的是一堆名词混着用:RFID、射频卡、ID卡、IC卡、M1卡、NFC。其实它们不是一回事。RFID是“无线射频识别”的总称,只要是靠电磁场读写数据的卡,都能叫RFID卡。NFC只是在13.56MHz频段下的一个短距通信技术。手机里的NFC读卡器,本质上就是一个工作在13.56MHz的小型RFID读写装置。
1.1 频率决定命运:125kHz和13.56MHz的区别
判断一张RFID卡能不能被手机NFC处理,第一眼要看频率,而不是看形状。
常见的老式门禁卡,很多是125kHz的低频卡。这类卡芯片简单,常见的有EM4100、T5577等,业内习惯叫它们“ID卡”。它们的特点是协议极其简单,通常只保存一串固定编号,读卡器读出编号后去后台比对。低频卡的优点是便宜、稳定,缺点是基本没有加密能力,也很容易被克隆,所以新做的小区门禁系统已经越来越少用低频卡。
现在主流的门禁系统,大多用13.56MHz的高频卡,标准是ISO 14443A。这类卡的代表就是MIFARE Classic 1K,也就是大家常说的S50,还有MIFARE Plus、MIFARE DESFire以及NTAG系列标签。它们除了卡号,内部还分了扇区,可以存数据,部分扇区还能加密。手机NFC正好工作在13.56MHz,理论上能读一部分高频卡,但低频卡直接没信号。
我把两种卡的类型差异整理成了一张表,方便你对照:
| 项目 | 125kHz低频ID卡 | 13.56MHz高频IC卡 |
|---|---|---|
| 常见芯片 | EM4100、T5577、HID Prox | MIFARE Classic S50、Plus、DESFire、NTAG21x |
| 常见称呼 | ID卡、老式门禁卡 | IC卡、M1卡、CPU卡、NFC标签 |
| 是否支持加密 | 基本不支持 | 支持扇区加密、滚动码、双向认证 |
| 手机NFC是否能读 | 通常读不到 | 部分可读、可写、可模拟 |
| 典型门禁应用 | 老旧小区、停车道闸 | 新小区、写字楼、校园卡 |
所以,当你问“rfid门禁采用什么芯片卡”,答案要看系统年代。老系统大概率是EM4100这种低频ID卡,新系统基本是MIFARE Classic S50或更高级的CPU卡。这直接影响你后续用手机NFC模拟的难度。
1.2 手机NFC不是万能的读卡器
很多朋友以为,手机上装个App就能读所有RFID卡,实测下来真不是这样。
手机里的NFC天线很小,发射功率也受电池和认证限制,它的读卡能力比专用读卡器弱。再加上手机系统通常只开放了“读标签”这类接口,对MIFARE Classic这些卡,Android会给App一个访问入口,但能不能读完整数据,取决于卡有没有开启加密扇区,以及App有没有对应的访问密钥。
我测试时用的是Google Play里常见的NFC TagInfo和MIFARE Classic Tool。NFC TagInfo负责看卡的“身份证”,比如ATQA、SAK、UID、卡容量;MIFARE Classic Tool负责读扇区数据。对于一张没有加密的S50测试卡,这类工具能把数据完整读出来;如果卡开了加密或者用了滚动码,工具只会停在“认证失败”这一步。
至于iPhone,NFC开放程度更有限。iOS 13之后开放了部分标签读取能力,但普通用户想靠iPhone模拟一张M1门禁卡,基本只有Apple Pay生态内的特定方案,远不如Android灵活。所以本文后面的实操都以Android手机为例。
1.3 手机钱包的门禁卡模拟,才是多数人的正路
说到“把RFID射频卡写入手机NFC”,大多数人脑海里的操作,是找一个App把卡完全复制到手机,用手机代替卡片去刷门禁。
但真正的量产方案,是手机厂商钱包里的“门禁卡模拟”功能。华为、小米、三星等品牌的手机钱包里都有类似“钥匙”“门卡”的入口。当你把实体卡贴在手机背面,钱包App会读取卡的基本信息,然后在一张虚拟卡中复现这张卡的UID和必要交互逻辑。整个过程严格受厂商限制,加密卡一般直接提示“不支持”。
所以我的基本建议是:先打开手机钱包找门禁卡入口,试试能不能直接模拟。这是门槛最低、成功率也最高的路径。如果你手里的卡不在支持范围,再考虑后面的技术方案。
2. 动手前的边界与选型:哪些卡能写、哪些不能碰
在开始折腾之前,我必须先把边界说清楚。因为“RFID怎么复制”“NFC破解卡密”这类词,搜索量很高,但里面藏着大量灰色内容。
技术本身是中性的,可读卡器和M1卡都是合法商品,但“复制与自己无关的卡”可能违反小区管理规定,也可能侵犯别人的门禁权限。我给自己定的规矩很简单:只操作自己合法持有的卡片,只买商家明确标注“测试用”的空白卡,遇到读不出来的加密扇区就停止,不碰任何绕过卡密的教程。
2.1 先学会看卡的类型:ATQA、SAK和UID
开始操作前,先拿一张你确定属于自己或专门买来的空白测试卡。打开NFC TagInfo,把卡贴在手机背面,你会看到一堆参数,其中最该看的是这四项:
- ATQA和SAK:这两个参数决定了卡属于哪个协议家族。比如MIFARE Classic 1K的SAK通常是08,NTAG系列的SAK通常是00。
- UID:卡的唯一标识,也是门禁系统最常用来绑定人的数据。UID在出厂时固化,大部分普通用户没有能力改变它。
- 卡容量:常见的有1K、4K,对应不同扇区数量。
- 是否检测到NDEF:如果App显示这张卡支持NDEF,说明它可以存普通数据和链接。
新手不需要死记参数,能分清“MIFARE Classic”和“NTAG/NFC Type 2”就够了。前者常用于门禁,后者常用于洗衣贴纸、智能标签。想在电脑上看得更直观,可以买一个PN532 USB读卡器,配合NFC Reader Tool这类桌面软件读基本信息,手机端搞不定的低频卡也能用读卡器判断频率。
2.2 三条安全边界,先讲清楚
我在折腾过程中给自己定了三条硬性规则,也建议所有看到这篇文章的人遵守:
第一,只操作自己合法持有的卡片。所谓合法持有,是指你自己买的门禁卡、公司发给你并明确授权使用的工牌、你自己拿来测试的空白卡。借别人的卡拿来复制,不管出于什么理由,都越界了。
第二,只买“空白测试卡”做实验。电商平台上有大量标注“空白M1测试卡”“UID可写卡”的商品,它们是合法的开发测试耗材。但买回来应该写自己的数据,而不是去复制物业门禁卡。
第三,遇到加密扇区就停。MIFARE Classic S50虽然存在已经被公开研究过的安全弱点,但这不代表普通人应该去用破解工具。手机钱包不支持,就换路线,或者直接去物业开通官方手机开门,这是最干净的做法。
2.3 几条技术路线的对比
在实际动手之前,先弄清楚“RFID射频卡写入手机NFC”至少有四条不同路线:
| 路线 | 做法 | 难度 | 适用场景 |
|---|---|---|---|
| 手机钱包模拟 | 钱包App读实体卡,生成虚拟门禁卡 | 极低 | 日常替代门禁卡 |
| Android HCE | 自己写App实现卡模拟 | 较高 | 学习协议、做Demo |
| 写NTAG标签 | 把数据或链接写入空白标签 | 低 | 名片、WiFi分享、巡更 |
| UID可写卡 | 用读卡器修改空白卡UID | 较高 | 测试兼容性,不建议乱用 |
很多人搜“id卡怎么写入nfc手机”,其实是被低频卡卡住了。如果实体卡是125kHz ID卡,手机NFC物理上读不到,任何软件方案都白搭。正确做法是换成IC卡门禁系统,或者让物业开一个支持NFC的手机开门权限。
3. 实操记录:把RFID卡数据写进手机NFC
下面这段是我自己走通的一条完整流程。我用的是一张空白MIFARE Classic S50测试卡,没有加密扇区,也没有动态口令,属于最简单也最合规的场景。
3.1 软硬件清单
我当时的配置如下,供你参考:
- Android手机一台,系统版本Android 8.0以上,开启NFC。
- 空白MIFARE Classic 1K测试卡一张,商家明确标注“测试用空白卡”。
- NFC TagInfo,用来查看卡的类型、UID、SAK等参数。
- MIFARE Classic Tool(MCT),用来读取和备份卡扇区数据。
- 手机自带的钱包App,里面自带“门禁卡”功能。
- 一台支持NFC的读卡器(可选),我后来用了PN532,主要是为了验证电脑端读取结果。
需要说明的是,MCT这类工具并不是“一按就复制”的傻瓜软件。它能否读到扇区数据,取决于卡的加密状态和访问密钥。对空白测试卡,它能正常读取;对加密卡,它只会报认证失败。这个特性其实是个很好的安全边界。
3.2 第一步:确认卡的类型和加密状态
把卡贴在手机背面,打开NFC TagInfo,App会很快识别出卡的基本参数。
我手里这张空白卡被识别成MIFARE Classic 1K,UID是4字节,SAK是08,说明它工作在13.56MHz,属于ISO 14443A协议族。这个结果很重要,意味着手机NFC硬件上能碰它。
接着打开MIFARE Classic Tool,点击“读Tag”,选择“读所有扇区”。因为空白测试卡通常使用出厂默认密钥,工具会很快读完整个卡的数据。我看到的NDEF区域全是FF或者00,属于正常的出厂状态。
如果这一步提示“认证失败”,说明这张卡有非默认加密扇区。此时不要再继续尝试什么绕过密钥。正确做法是,拿另一张确定不加密的测试卡来做实验,或者直接走手机钱包模拟。
3.3 第二步:用手机钱包完成卡模拟
确认卡可以被读取后,我开始尝试正经路线:用手机钱包模拟它。
在小米、华为等品牌手机上,流程大同小异:
- 打开钱包App,找到“门禁卡”或“钥匙”入口。
- 选择“添加门禁卡”或“模拟实体门禁卡”。
- 把实体卡贴在手机背面NFC区域,等待读卡进度条走完。
- 读卡成功后,App会让你给虚拟卡起个名字。
- 这张虚拟门禁卡会出现在钱包卡包里,你可以把它设为默认卡。
我实际操作时,钱包App读取的是卡的UID和基础交互信息,然后在本机安全芯片中生成了一张虚拟卡。这个过程很顺畅,全程不到半分钟。有人喜欢把它理解为“写进手机”,更准确的说法是“在手机安全芯片中生成等效卡”。用户感知上,确实等同于实体卡被写进了手机。
如果你的钱包提示“该卡不支持模拟”,不要急着换App或者找破解工具。先检查卡类型:是不是低频ID卡?是不是加密卡?是不是CPU卡?这些卡都不在普通钱包的模拟范围内。
3.4 第三步:追加一个亲测可用的读卡调试流程
如果你是想做开发调试,而不是单纯刷门禁,可以在电脑上走一遍读卡流程,代码逻辑和手机端很像。
我用PN532连接电脑,再用NFC Reader Tool读取同一张S50测试卡,结果显示的UID和扇区数据与手机端一致。这样的好处是,读取过程可以截图留档,便于后面写自动化脚本或生成测试报告。
读卡器的接线方式一般很简单,PN532通过USB转TTL或直接USB连接电脑。注意供电要稳定,有些读卡器接笔记本前置USB口会供电不足,导致识别不稳定。读卡器属于低频测试工具,配合桌面软件使用,属于正规开发流程,没必要把它和破解划等号。
3.5 验收与日常刷卡心得
模拟完成不代表结束,一定要到真实门禁上测一遍。
我的测试经验是:先保持手机亮屏,贴近读头,如果能开,再试锁屏状态。厂商钱包通常把虚拟卡放在安全芯片中,屏幕熄灭也能工作。但有些门禁读头灵敏度低,手机需要找对贴合位置,一般集中在手机背面上半部分。
最常踩的坑是“默认卡冲突”。如果你的钱包里同时有公交卡、门禁卡、银行卡,刷卡时手机可能默认弹出交通卡而不是门禁卡。解决办法是把实体门禁模拟出来的虚拟卡设为默认卡,或者开启钱包里的“智能选卡”功能。门禁卡模拟成功后,App设置里一般有“默认卡”选项,务必检查一遍。
4. 常见问题、安全防护与更多玩法
整段心路走下来,最值钱的不是“成功”那一瞬间,而是后面排查问题、补安全知识的过程。我把常见问题按发生频率从高到低排了个序。
4.1 能读卡却模拟失败,究竟卡在哪
手机显示读到了卡,但钱包提示不支持,八成是下面几个原因:
- 卡是加密卡,扇区密钥不是默认值,厂商钱包不读取加密扇区。这种情况直接用钱包模拟基本无解,但卡还能正常刷门禁,不用焦虑。
- 卡是CPU卡,比如部分校园卡、银行卡,协议比M1复杂,普通钱包根本没有对应的虚拟卡实现。
- 卡的UID比较特殊,或者门禁系统还校验了其他字节,模拟出来的虚拟卡无法通过后台认证。
- 手机钱包版本太老,厂商后来才支持某类卡,建议先升级系统和安全组件再试。
排查顺序也简单:先拿一张空白S50测试卡试钱包模拟,如果连空白卡都不行,说明是手机或钱包的问题;如果空白卡成功而实体卡失败,说明是卡的问题。
4.2 模拟成功但刷不开门禁
这是最容易让人崩溃的情况:明明手机显示模拟成功,到门口却不管用。
我先检查门禁读头是不是13.56MHz的。有些老旧门禁用125kHz低频ID卡,手机NFC频率对不上,当然刷不开。如果读头确实是高频IC卡门禁,那原因可能是门禁后台绑定的是实体卡的UID,而手机虚拟卡生成的UID和实体卡不完全一致。
还有一些门禁系统会定期滚动码,或要求刷卡时附加动态认证,这种卡即使被模拟出来,后台也能识别出异常。遇到这种情况,我的建议是直接放弃模拟,找物业或公司行政开通官方NFC权限。硬要绕过反而容易弄坏读卡记录,也给自己惹麻烦。技术不是用来对抗管理规则的。
4.3 NFC中继攻击和RFID屏蔽,值得认真说一说
因为“nfc中继攻击”是最近很多人搜的热词,我觉得有必要用防守视角解释一次。
中继攻击的基本概念是:攻击者用两个设备把卡片的电磁信号延长传输,让验证端误以为卡片就在现场。比如卡主在办公室,攻击者在地铁闸机处持有一台设备,通过中继让闸机读到远在几公里外的卡数据。这个攻击的技术门槛并不高,所以NFC相关标准越来越强调双向认证和距离判定。
普通用户能做的事很简单:不要把高权限门禁卡、银行卡放在包的最外层;在人多的地方刷卡时,用手遮挡一下读卡区域。如果你还是不放心,可以买RFID屏蔽卡套,或者在证件卡套里放一层铝箔,这能有效阻断非接触读取。像“rfid芯片怎么屏蔽”这种搜索词,正解不是去拆芯片,而是物理隔离。
要注意,屏蔽卡套不是万能的。它在停用车道、贴卡充电等场景里反而会挡信号,用完之后记得把卡取出来。
4.4 顺手的NFC玩法:写名片、读标签、uni-app读取
打通手机NFC读写流程后,你的NFC能力就不仅仅是门禁了。我用几张NTAG213空白标签,把个人博客地址和WiFi账号密码写了进去。手机靠近标签会自动弹出提示,体验很自然,适合做小批量礼品卡片。
如果你做前端开发,想在小程序或uni-app里读取NFC标签,思路也很直接。uni-app有NFC适配器接口,可以读取标签ID和技术列表。核心逻辑大致是:
uni.getNFCAdapter({ success(res) { const nfc = res.nfcAdapter; nfc.startDiscovery({ success() { nfc.onDiscovered((res) => { // res.id 是标签UID,res.techList 是支持的技术列表 console.log(res.id, res.techList); }); }, fail(err) { console.warn('NFC discovery failed', err); } }); } });这段代码适合用来做卡片ID读取的初步验证,比如巡检签到、设备ID识别这类场景。真正要开发完整应用,还要处理权限申请、Android版本差异和iOS兼容性,建议先在真机上反复测。
从折腾到落地,我最深的体会是:RFID射频卡写入手机NFC这件事,内核不是“复制”,而是“理解”。理解卡的频率、芯片、加密状态,理解手机和钱包的限制,然后始终把合法使用放在第一位。如果你能守住这个边界,剩下的只是熟练度的积累。后面如果再进阶,可以研究Android HCE协议栈、卡模拟APDU交互,那又是一个更深也更有意思的领域。