热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用密码保护读写NFC标签-Read/writetoNFCtagwithpasswordprotection

IneedtowritereadtextualdatatoanNFCtag.ThewayIamexpectingthereadwriteshouldworki

I need to write/read textual data to an NFC tag. The way I am expecting the read/write should work is the following:

我需要为NFC标签写/读文本数据。我期望读写工作的方式如下:

  1. First time write I should be able to set password.
  2. 第一次写我应该能够设置密码。
  3. Next time when anyone tries to read OR write, if he has the password then he should be able to do the read/write.
  4. 下次当任何人试图读或写时,如果他有密码,那么他应该能够读/写。
  5. No other application should be able to modify my tag without the password I set at step 1.
  6. 没有步骤1中设置的密码,任何其他应用程序都不能修改我的标记。

I had one other approach in mind writing encrypted data to the tag once and the write is done make the tag read only. I am able to do this. But now I realize making the tag read-only is not so efficient.

我还想到了另一种方法,即将加密数据写入标记一次,并完成写操作,使标记仅读取。我能做到这一点。但是现在我意识到使标签只读不是那么有效。

I searched a lot over the internet but did not find any reliable article or guide yet. So if anyone has done password protection of NFC tags please guide me.

我在网上搜索了很多,但是没有找到任何可靠的文章或指南。如果有人对NFC标签进行了密码保护,请指导我。

2 个解决方案

#1


6  

An NFC tag (or actually an NFC Forum tag that implements one of the five NFC Forum Tag Operation specifications) is a simple data memory without any security mechanisms (other than locking memory to read-only). These tags are intended to store freely readable data in NDEF format. No authentication or protection mechanisms against reading of tag contents (or copying of tag contents to other tags) are standardized.

一个NFC标记(或者实际上是一个NFC论坛标记,它实现了五个NFC论坛标记操作规范之一)是一个简单的数据内存,没有任何安全机制(除了将内存锁定为只读)。这些标记旨在以NDEF格式存储可自由读取的数据。没有针对读取标记内容(或将标记内容复制到其他标记)的身份验证或保护机制是标准化的。

However, some existing tag products implement additional security features that go beyond what is specified by the NFC Forum.

然而,一些现有的标签产品实现了额外的安全特性,超出了NFC论坛指定的范围。

The most simple mechanism is a short "password" (typically a 32-bit value). For authentication, this password is transmitted to the tag in cleartext and the tag acknowledges/rejects the authentication. (Note that transmission in cleartext over NFC means that anyone sniffing the communication is able to obtain the password.) Some tags supporting this type of password protection can use the authentication to switch a defined memory area between no access, read-only access, and read/write access.

最简单的机制是一个简短的“密码”(通常是一个32位的值)。对于身份验证,该密码将传输到明文中的标记,标记确认/拒绝身份验证。(注意,通过NFC以明文传输意味着任何嗅探通信的人都能够获得密码。)支持这种类型的密码保护的一些标记可以使用身份验证来切换未访问、只读访问和读/写访问之间的定义内存区域。

  • Products implementing this type of password validation are, for example, Infineon SLE66R01P, NXP MIFARE Ultralight EV1, and NXP NTAG21x.
  • 实现此类密码验证的产品有Infineon SLE66R01P、NXP MIFARE Ultralight EV1和NXP NTAG21x。

A more sophisticated approach is mutual challenge-response authentication using a shared key. Compared to a simple cleartext password, this means that a passive eavesdropper can't discover the shared key. As with the password, the authentication state may be used to switch a defined memory area between no access, read-only access, and read/write access with most existing tag products. However, not all of them cryptographically bind the memory access and the authentication pahse together.

一种更复杂的方法是使用共享密钥进行相互查询-响应身份验证。与简单的明文密码相比,这意味着被动窃听者无法发现共享密钥。与密码一样,身份验证状态可用于在大多数现有标记产品的无访问、只读访问和读/写访问之间切换已定义的内存区域。然而,并不是所有的密码都将内存访问和认证pahse绑定在一起。

  • Products implementing a three-pass mutual authentication are, for example, NXP MIFARE Classic*, NXP MIFARE Ultralight C, NXP MIFARE DESFire (EV1), Sony FeliCa cards.

    实现三通互认证的产品有:NXP MIFARE Classic*、NXP MIFARE Ultralight C、NXP MIFARE DESFire (EV1)、索尼FeliCa cards。

    *) Note that the proprietary authentication and encryption protocol of MIFARE Classic is known to be broken since 2008. Moreover, MIFARE Classic is only supported on Android devices with an NFC chipset from NXP.

    *)注意到MIFARE Classic的专有认证和加密协议自2008年起就被打破了。此外,MIFARE Classic只支持基于NXP的NFC芯片的Android设备。

When it comes to implementing any from of authentication on Android, you should be aware of the following:

当涉及到在Android上实现任何身份验证时,您应该了解以下内容:

  1. If you still want to benefit from automatic starting of your app through an NDEF message (either a custom record that you declare in the intent filter or an Android Application Record), you need to have a freely readable memory are containing that NDEF message. Since password protection/authentication is not part of the NFC Forum specifications, Android itself can't authenticate to the tag (Android would not have the right key/password anyways). Consequently, the NDEF memory area (for tags with flat linearly-addressable memory this is typically the first N blocks of the tag memory) must be readable without authentication.

    如果您仍然希望通过NDEF消息(您在intent filter中声明的自定义记录或Android应用程序记录中声明的自定义记录)自动启动应用程序,那么您需要拥有一个可自由读取的内存,其中包含NDEF消息。由于密码保护/认证不是NFC论坛规范的一部分,Android本身无法对标签进行身份验证(无论如何Android都没有正确的密钥/密码)。因此,NDEF内存区域(对于具有平滑的lin早期可寻址内存的标记来说,这通常是标记内存的第一个N块)必须在没有身份验证的情况下是可读的。

  2. Even if you do not use NFC intent filters in the application manifest and only use the foreground dispatch system (or the reader-mode API), you might still want to use NDEF to discover/filter for your tags.

    即使您在应用程序清单中不使用NFC意图过滤器,并且只使用前台调度系统(或读卡器模式API),您可能仍然希望使用NDEF来发现/过滤您的标记。

  3. You cannot use the NDEF abstraction layer (i.e. the Ndef/NdefFormatable classes) to access the protected memory area. Instead, you need to exchange the tag platform-specific low-level commands using one of the tag technology classes (NfcA, ..., IsoDep). Also don't try to mix between mutliple tag classes (e.g. using NfcA for sending the authentication command and Ndef for reading the data afterwards). While this works on some devices, it won't work on most devices since they reset the communication with the tag when swithcing between these communication objects.

    不能使用NDEF抽象层(即NDEF /NdefFormatable类)访问受保护内存区域。相反,您需要使用一个标记技术类(NfcA,…)交换标记特定于平台的低级命令。IsoDep)。也不要尝试混合使用多个标签类(例如使用NfcA发送身份验证命令,使用Ndef来读取数据)。虽然这在某些设备上可行,但在大多数设备上却行不通,因为当在这些通信对象之间切换时,它们会重置与标记的通信。

  4. There are known issues with the tag presence check mechanism on some Android devices (mainly before Android 5) that may interfere with the authentication (i.e. the presence check may send commands between the authentication commands resulting in authentication failures). This problem can be overcome with the reader-mode API.

    一些Android设备(主要在Android 5之前)上的标签存在检查机制存在一些已知的问题,这些问题可能会干扰身份验证(例如,存在检查可能会在身份验证命令之间发送命令,导致身份验证失败)。这个问题可以通过读者模式API来解决。

  5. Finally, be aware that if you store the password/authentication key within an app, an attacker could easily reverse-engineer your app to obtain the key.

    最后,请注意,如果您将密码/身份验证密钥存储在应用程序中,攻击者可以很容易地反向工程您的应用程序以获取密钥。

#2


3  

Some tags such as MIFARE DESFire natively support passwords / encryption as you describe. Recreating this functionality on the more common types of tags (Topaz/MIFARE Ultralight, etc.) is inherently impossible as NFC tags do not have built in protections for the copying of their data (by design). You could potentially encrypt your data before it is encoded, but this would require the tool decoding the data to be privy to the encryption method (likely a standalone app, separate to the Android OS, for example). Cheaper tags can, as you say, only be made permanently read only.

一些标签,如MIFARE DESFire本机支持密码/加密,正如您所描述的那样。在更常见的标签类型(Topaz/MIFARE Ultralight等)上重新创建此功能本质上是不可能的,因为NFC标签没有内置对数据复制的保护(按照设计)。您可以在数据被编码之前对其进行加密,但这需要解码数据的工具对加密方法保密(例如,一个独立的应用程序,独立于Android操作系统)。正如你所说,更便宜的标签只能被永久读取。

In other words, most NFC tags will not support what you are trying to achieve but there exists tags (that are considerably more expensive) that support larger amounts of data and tools such as password based encryption.

换句话说,大多数NFC标签不会支持你想要实现的目标,但是存在一些标签(这些标签要昂贵得多),支持更多的数据和工具,比如基于密码的加密。

As MIFARE DESFIRE adhere to ISO 14443-4 and assuming you're using Android you are able to make use of the IsoDep methods. For more info about how to read/write passwords, etc. see this related article: How well does the Android NFC API support Mifare Desfire?

由于MIFARE DESFIRE坚持使用ISO 14443-4,并且假设您正在使用Android,那么您就可以使用IsoDep方法。有关如何读取/写入密码等的更多信息,请参阅本文:Android NFC API支持Mifare Desfire的能力如何?


推荐阅读
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • javax.mail.search.BodyTerm.matchPart()方法的使用及代码示例 ... [详细]
  • 全面升级的中文PubMed——Medreading
    Medreading 是一款由科研者之家(HOME for Researchers)推出的中文版PubMed,提供强大的文献检索和分析功能,支持AI辅助全文下载。 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 属性类 `Properties` 是 `Hashtable` 类的子类,用于存储键值对形式的数据。该类在 Java 中广泛应用于配置文件的读取与写入,支持字符串类型的键和值。通过 `Properties` 类,开发者可以方便地进行配置信息的管理,确保应用程序的灵活性和可维护性。此外,`Properties` 类还提供了加载和保存属性文件的方法,使其在实际开发中具有较高的实用价值。 ... [详细]
  • 本文详细解析了一种实用的函数,用于从URL中提取查询参数。该函数通过处理URL中的搜索部分,能够高效地获取并解析出所需的参数值,适用于各种Web开发场景。 ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • 在《ChartData类详解》一文中,我们将深入探讨 MPAndroidChart 中的 ChartData 类。本文将详细介绍如何设置图表颜色(Setting Colors)以及如何格式化数据值(Formatting Data Values),通过 ValueFormatter 的使用来提升图表的可读性和美观度。此外,我们还将介绍一些高级配置选项,帮助开发者更好地定制和优化图表展示效果。 ... [详细]
  • 本文深入探讨了如何利用Maven高效管理项目中的外部依赖库。通过介绍Maven的官方依赖搜索地址(),详细讲解了依赖库的添加、版本管理和冲突解决等关键操作。此外,还提供了实用的配置示例和最佳实践,帮助开发者优化项目构建流程,提高开发效率。 ... [详细]
  • 在安装并配置了Elasticsearch后,我在尝试通过GET /_nodes请求获取节点信息时遇到了问题,收到了错误消息。为了确保请求的正确性和安全性,我需要进一步排查配置和网络设置,以确保Elasticsearch集群能够正常响应。此外,还需要检查安全设置,如防火墙规则和认证机制,以防止未经授权的访问。 ... [详细]
author-avatar
橘子火4
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有