是否可以在NFC卡中实现令牌队列?

Mik*_*oft 8 rfid smartcard nfc mifare contactless-smartcard

这个问题专门与MIFARE Ultralight C / EV1或MIFARE DESFire EV1甚至NTAG卡有关。我想实现一个令牌系统,以便普通用户每次读取其中一张卡时,都会得到一个可用的令牌。该令牌将从他们正在读取的NFC卡中“弹出”。换句话说,每次读取NFC芯片时,它将从卡的存储中发出不同的可用令牌。这可能实现吗?

vlp*_*vlp 5

更新2020/06/07>

\n\n

NTAG 424支持“安全动态消息传递”,这可能适用于您的用例。您可以使用“动态部分”存储任何 NDEF 消息,该部分可以选择加密和身份验证。

\n\n

引用NTAG 424 数据表第 9.3 节:

\n\n
\n

安全动态消息传递 (SDM) 允许进行机密和完整性保护的数据交换,无需事先进行身份验证。NT4H2421Tx 支持 SDM 从 PICC 上的标准数据文件之一读取。安全动态消息传送允许增加数据读取的安全性,同时仍然能够使用标准 NDEF 读取器访问数据。典型的用例是 NDEF 保存 URI 和一些元数据,其中 SDM 允许将此元数据的机密性和完整性保护到后端服务器。

\n
\n\n

但请注意,该解决方案不能抵抗某些特定的尾部重放场景,引用:

\n\n
\n

使用 SDM 时,必须考虑安全动态消息传递带来的残余风险。由于SDM 允许自由读取受保护的消息,即无需任何预先的读取器身份验证,因此任何人都可以读出该消息。这意味着潜在的攻击者也能够读取并存储一条或多条消息,并在稍后的时间点将它们播放给验证者。\n 如果系统无法接受此残余风险\xe2\x80在用例中,应应用传统的相互身份验证(使用质询响应协议)和后续的安全消息传递。这需要使用自己的应用程序并在标准 NDEF 读取操作之外进行操作。可以对 SDM 应用其他风险缓解措施来限制残余风险,而不需要完全删除它:

\n\n
    \n
  • 在验证端跟踪每个标签的 SDMReadCtr。拒绝以前见过的或无序播放的 SDMReadCtr 值。这是任何验证者都应该实现的最低要求。

  • \n
  • 通过要求定期呈现标签(例如每天至少一次)并结合之前的缓解措施来限制攻击者的时间窗口。

  • \n
  • 多次读出受 SDM 保护的文件。这不能防止攻击者多次读取有效标签并以相同的顺序播放收到的响应。

  • \n
\n
\n\n

(请注意,上述遗留相互身份验证协议是我在下面的原始答案中描述的)

\n\n

有一个有趣的项目实现后端服务器(带有标签个性化说明)。

\n\n

原答案如下:

\n\n
\n\n

常见的不可编程智能卡通常提供以下功能之一(或某种组合):

\n\n
    \n
  • 熔丝位——一个存储区域,其中各个位的值只能以一种方式改变(从零到一或从一到零,但不能同时改变两者)

  • \n
  • 单调计数器——存储在卡上的整数值,在个性化后只能在一个方向上改变(增加或减少,但不能同时增加或减少)

  • \n
  • 电子钱包——一个整数值,可以由一个实体减少并由另一个实体增加(两个实体都通过不同的密钥证明自己)

  • \n
\n\n

这些函数都没有直接提供任何不可预测的标记(参见注释 1)。

\n\n

另一方面是您的“令牌收集器”必须拥有允许卡写入访问的密钥(以便能够修改计数器/钱包)——这使他们能够轻松耗尽所有剩余的保险丝位或计数器/钱包值(有效地)导致其他“令牌收集器”拒绝服务条件)。访问控制不能细粒度到仅允许单个令牌收集(这可能是您想要的)。

\n\n

使用可编程智能卡,您可以(半)轻松地实现您需要的任何操作语义 - 看看 Java Card(尽管可编程智能卡更昂贵)。

\n\n
\n\n

鉴于您的“令牌收集器”在读取卡时在线,那么最简单的方法可能是仅使用该卡来证明“令牌收集器”位于其附近并在服务器上生成“令牌”。

\n\n

为了证明与卡的接近度,“令牌收集者”将使用他/她的 NFC 手机在服务器和卡之间转发相互身份验证命令。为此,他/她不需要知道任何卡密钥。

\n\n

任何具有相互身份验证功能的智能卡(例如 Ultralight-C 或 DESFire)都可以在这种情况下使用(参见注释 2 和 3)。

\n\n

DESFire 的通信看起来与此类似:

\n\n

简化的序列图

\n\n

祝你好运!

\n\n
\n\n

注1:实际上有些卡可以为其电子钱包生成不可预测的“余额证书”,但我不知道有任何CL卡支持此功能。

\n\n

注 2:具有基于密码的身份验证的卡不适合,因为“令牌收集者”可以轻松拦截发送到卡的密码。MIFARE Classic 不适合,并且加密密钥需要直接加载到读卡器(无法中继)。

\n\n

注 3:请注意,通过执行此中继身份验证,您授予“令牌收集器”绑定到相应密钥的所有访问权限(尽管他/她不知道会话密钥的值)。因此,Ultralight-C 不是一个好的选择,因为从技术上讲,您将给予他/她对卡的完全访问权限。同样,不要使用 DESFire 卡主密钥进行中继身份验证 - 使用 2 个应用程序密钥(具有只有您知道的随机值)创建一个新应用程序,并使用第二个密钥(不是应用程序主密钥)进行中继身份验证。请记住也要更改卡主密钥。

\n\n

注 4:DESFire EV2 具有命令中继保护功能,因此您必须测试它是否适用于您的场景。

\n