有两个应用程序。一个是客户在他们的个人资料下有他们的二维码(目前只是他们唯一的客户ID),另一个是商业员工扫描二维码。我担心客户可能会复制另一个客户的二维码并让员工扫描一张图片。
我不太了解安全性,但首先想到的是客户应用程序和扫描仪应用程序可能有一个密钥来签署QR代码。以下是对David Schwartz的回答,不幸的是,我不确定如何在Swift级别实现它,或者它是否适用于我的情况:
使用私钥对QR代码数据进行签名。读者需要 用于验证QR码的公钥,但不需要保存公钥 秘密。
如果您使用ECDSA Secp256K1密钥,签名将仅添加 到QR码数据的68个字节。
在QR码中也包括发行日期。读者需要 本地时钟检查QR码是否太旧。如果读者 没有时钟,你至少可以跟踪最新的有效时间 你见过的代码。在此之前一年多发布的任何代码 日期肯定无效。
BouncyCastle和OpenSSL都包含代码的实现 你需要的。
如果代码阅读器/验证器可以包含所有内容 生成假QR码所需的信息,然后您可以使用HMAC 而不是ECDSA。这更简单,HMAC可以尽可能少 16字节仍然可以完成工作。
我对安全性非常陌生,所以即使这个过程让我感到困惑,但根据我的理解,我的客户应用程序应该能够用密钥“签署”QR代码信息,扫描仪应用程序应该能够以某种方式解码签名的QR码信息?
我想到的另一件事是......如果我在App Store的应用程序中存储私有内容,就像密钥一样,有人能够破解我的代码并找到它吗?如果是这样,我应该如何在应用程序中隐藏我的“密钥”?
非常感谢。
答案 0 :(得分:1)
您已发布了几个问题。我将回答关于实际QR码安全性的问题。我不会就如何安全地将您的密钥存储在应用程序中或如何在Swift中实现任何内容给出答案。
据我所知,您链接的文字关注的是生成QR码,这不是您所面临的问题。您可以根据需要使QR码的生成变得复杂和安全 - 最终输出始终是您可以复制的图像。
因此我有两个想法:
简单的想法:在qr代码中包含当前时间戳和客户ID,并让服务器验证时间戳是否接近当前时间戳。这有效地防止了某人简单地复制你的qr代码,因为副本只有几秒钟有效。但有人可以只分析代码中的数据并创建一个自定义数据,并始终输出其他人的代码及其客户编号和时间戳。
归结为使代码生成安全/可靠,这基本上是链接文本的用途。
企业员工扫描代码后,立即向客户发送确认推送消息。如果客户端按下OK或使用其他类型的确认,您可以确定qr代码确实是站在员工面前的用户的qr代码。
工作流程
我会推荐第二个选项,因为它看似非常合乎逻辑且非常直接且容易理解。
但是,由于我远离安全工程师,所以我不能保证它确实是安全的。