手机可以模拟NFC卡片吗 项目中如何解决不能模拟NFC Tag UID的问题

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

Android, BlackBerry都提供了模拟NFC卡片的API,理论上可以用手机模拟出一张饭卡,交通卡,甚至银行卡去进行身份认证,交易了,是不是很开心,心情很激动啊?


且慢

实际情况是

应用场景:

  •  国内大部分,99%的卡片是最便宜的M1卡片,而且整个系统只适用了卡片的UID数据。
  • NFC卡片的UID在卡片出厂下生产线的时候,就不能再修改了!


手机能否设置NFC UID?

  • 手机不能模拟出NFC卡片上固定或者是指定的UID,
  • 换句话说,手机上模拟出的NFC卡片的UID是随机+动态的
  • 手机上没有指定UID的API     (早期Android, BlackBerry手机都提供了设置UID的API,但出于安全考虑,短短半年时间后就都分别禁用了这个API)

解决办法?

  • 改造读卡机具,改造后台认证系统

    读卡机具读NFC卡片的标识和其他数据区域,判断卡片是普通的NFC卡片,还是更加安全的NFC手机;

    如果是NFC手机,读卡机具读出NFC卡片的其他数据区域(手机模拟的NFC卡片上其他区域的数据可以是设置指定的,可以做加密,甚至象RSA Token那样做动态更新),到后台进行身份认证成功。

    如果是普通的NFC卡片,读卡机具读出NFC卡片的UID,到后台进行身份认证成功。




参考:

十问Android NFC手机上的卡模拟

用NFC手机可以开的酒店门锁( 国产)

NFC门锁(国外)

           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
这里写图片描述
在 Android 11 ,可以使用 `NfcAdapter#enableReaderMode` 方法来启用应用程序的 NFC 卡器模式。在这种模式下,当设备取到支持 NFC 技术的标签时,应用程序将会接收到回调事件,可以在回调事件访问标签上的数据。 要实现当卡器手机 NFCUID 不变,可以在回调事件使用 `IsoDep` 类来和标签进行通信。在与标签进行通信时,可以使用 `IsoDep#getHistoricalBytes` 方法来获取标签的历史字节,从而获得 UID 信息。 以下是一个示例代码: ```java public class MainActivity extends AppCompatActivity implements NfcAdapter.ReaderCallback { private NfcAdapter nfcAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); nfcAdapter = NfcAdapter.getDefaultAdapter(this); } @Override protected void onResume() { super.onResume(); enableReaderMode(); } @Override protected void onPause() { super.onPause(); disableReaderMode(); } private void enableReaderMode() { Bundle options = new Bundle(); options.putInt(NfcAdapter.EXTRA_READER_PRESENCE_CHECK_DELAY, 5000); nfcAdapter.enableReaderMode(this, this, NfcAdapter.FLAG_READER_NFC_A | NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK, options); } private void disableReaderMode() { nfcAdapter.disableReaderMode(this); } @Override public void onTagDiscovered(Tag tag) { IsoDep isoDep = IsoDep.get(tag); try { isoDep.connect(); byte[] historicalBytes = isoDep.getHistoricalBytes(); if (historicalBytes != null) { String uid = bytesToHex(Arrays.copyOfRange(historicalBytes, 2, 10)); Log.d("MainActivity", "UID: " + uid); } } catch (IOException e) { e.printStackTrace(); } finally { try { isoDep.close(); } catch (IOException e) { e.printStackTrace(); } } } private static String bytesToHex(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (byte aByte : bytes) { sb.append(String.format("%02X", aByte)); } return sb.toString(); } } ``` 在上述代码,我们首先在 `onResume` 方法启用了 NFC 卡器模式,并在 `onPause` 方法禁用了该模式。在 `onTagDiscovered` 方法,我们使用 `IsoDep` 类与标签进行通信,并在回调事件获取标签的历史字节。最后,我们从历史字节提取 UID 信息,并打印到日志
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值