NFC with URL 和上面写的服务器信息

NFC with URL and information for the server written on it

目前我正在尝试制作一个系统,它使用 NFC 标签来确定客户端是否已到达指定位置。

我目前的解决方案很简单,很容易上当。 NFC 标签有一个带有 GET 信息的 URL ( service.domain/index.php?location=1 )。一个人只需手动输入正确的 URL 即可轻松复制。

所以我在想的是,我需要一些方法让 NFC 标签保存一个唯一的 'not so easy to access' 密钥,当在浏览器中打开 URL 时,它会提交给服务器.类似于页面上的表单如何生成 POST 数据,用户不可见。

目前网上关于此类的资料很少,希望这里有人能提供解决方案。它几乎可以是任何一种解决方案,只要它坚持通过用户互联网浏览器工作的原则,当他将他的设备(NFC reader、phone 等)放在 NFC 上时标签。

这看起来像是数字签名的工作。

而不是写:

service.domain/index.php?location=1

在你的标签上,你可以这样写:

service.domain/index.php?location=1&nonce=some-number&sig=some-base64-string

想法是,您将一个上升的随机数附加到 URL。随机数不应重复使用和升序。您在此 URL 上构建数字签名并附加它。

只有您拥有生成有效签名的私钥。然而,每个 reader 位置可能有 public 密钥,用于检查签名的有效性。这使得 URL 防篡改,例如任何人都无法通过仅修改位置来构建有效的 url。

攻击者仍然能够复制此 URL 并将其写入不同的标签。但是,他既不能更改随机数、签名,也不能更改位置。如果您跟踪 nonce 值并在使用后验证它们(通过使用新的 nonce 和新的签名重写标签),您可以检测到用副本欺骗系统的尝试。

您也可以将UID加入到签名计算中。这使得攻击变得更加困难,因为如果攻击者想要复制,他还必须克隆 UID(可能,但这需要相当多的专业知识)。

它不是绝对安全,但破解这个系统需要相当多的犯罪精力和努力。

如果您使用这样的系统,我建议使用椭圆曲线数字签名,因为它们的签名非常小,甚至应该适合小标签。