如何安全地将唯一的客户 QR 码传输到业务扫描仪?
How can I securely transmit a unique customer QR code to business scanner?
有两个应用程序。一种是针对在个人资料下有二维码的客户(目前只是他们唯一的客户 ID),另一种是业务员工扫描二维码。我担心客户可能会复制其他客户的二维码并让员工扫描照片。
关于安全性我不太了解,但首先想到的是可能让客户应用程序和扫描器应用程序有一个密钥来签署二维码。以下是 David Schwartz 的回答,不幸的是,我不确定如何在 Swift 级别上实施它,或者它是否适用于我的情况:
QR code security
Sign the QR code data with a private key. The readers will need the
public key to verify the QR code, but the public key need not be kept
secret.
If you use an ECDSA Secp256K1 key, the signature will only add about
68 bytes to the QR code data.
Include the date of issue in the QR code as well. The reader will need
a local clock to check that the QR code isn't too old. If the reader
doesn't have a clock, you can at least keep track of the newest valid
code you have ever seen. Any code issued more than a year before that
date is definitely invalid.
Both BouncyCastle and OpenSSL contain implementations of the code
you'll need.
If it's okay for the code readers/verifiers to contain all the
information needed to generate a fake QR code, then you can use HMAC
instead of ECDSA. That's simpler and an HMAC can be as little as
16-bytes and still do the job.
我对安全性很陌生,所以即使这个过程让我有点困惑,但据我了解,我的客户应用程序应该能够 "sign" 带有密钥的二维码信息,扫描器应用程序应该不知何故能够解码签名的二维码信息?
想到的另一件事.. 如果我在 App Store 的应用程序中存储一些私有的东西,比如密钥,有人能够破解我的代码并找到它吗?如果是这样,我应该如何在应用程序中隐藏我的 "key"?
非常感谢。
您发布了几个问题。我将回答有关实际二维码安全性的问题。我不会就如何安全地将密钥存储在应用程序中或如何在 Swift.
中实现这些问题给出答案。
据我所知,您链接的文本与生成二维码有关,这不是您面临的问题。您可以根据需要使 QR 码的生成尽可能复杂和安全 - 最终输出始终是您可以复制的图像。
因此我有两个想法:
1。使二维码动态化
简单的想法:在二维码中包含当前时间戳和客户 ID,并让服务器验证时间戳是否接近当前时间戳。这有效地防止了某人简单地复制您的二维码,因为副本仅在几秒内有效。但是有人可以只分析代码中的数据并创建一个自定义代码,它始终输出其他人的代码及其客户编号和时间戳。
这归结为使代码的生成安全/可靠,这基本上就是链接文本的目的。
2。使用某种双向授权
业务员扫码后,立即向客户发送确认推送消息。如果客户按下“确定”或使用某种其他类型的确认,您可以确定二维码确实是站在员工面前的用户的二维码。
工作流程是
- 客户端显示二维码
- 业务员扫码,app联系服务器
- 服务器向客户端发送推送通知phone
- 客户端收到推送通知,调用服务器确认
- 企业员工收到来自服务器的确认并且准备就绪
我会推荐第二个选项,因为它看起来非常合乎逻辑,非常直接且易于理解。
但是我丝毫不保证它真的是安全的,因为我不是安全工程师。
此外,对于第二种方式,您可以这样做:
1-在客户端的二维码页面上,从服务器获取唯一码并显示为二维码
2-业务员扫码,app联系服务器授权码
完成了。
- 独特的代码可以有大约 2 分钟的有效期。
- 在客户端的二维码页面,您可以每2分钟刷新一次二维码
- 二维码可以是简单的MD5:D
有两个应用程序。一种是针对在个人资料下有二维码的客户(目前只是他们唯一的客户 ID),另一种是业务员工扫描二维码。我担心客户可能会复制其他客户的二维码并让员工扫描照片。
关于安全性我不太了解,但首先想到的是可能让客户应用程序和扫描器应用程序有一个密钥来签署二维码。以下是 David Schwartz 的回答,不幸的是,我不确定如何在 Swift 级别上实施它,或者它是否适用于我的情况:
QR code security
Sign the QR code data with a private key. The readers will need the public key to verify the QR code, but the public key need not be kept secret.
If you use an ECDSA Secp256K1 key, the signature will only add about 68 bytes to the QR code data.
Include the date of issue in the QR code as well. The reader will need a local clock to check that the QR code isn't too old. If the reader doesn't have a clock, you can at least keep track of the newest valid code you have ever seen. Any code issued more than a year before that date is definitely invalid.
Both BouncyCastle and OpenSSL contain implementations of the code you'll need.
If it's okay for the code readers/verifiers to contain all the information needed to generate a fake QR code, then you can use HMAC instead of ECDSA. That's simpler and an HMAC can be as little as 16-bytes and still do the job.
我对安全性很陌生,所以即使这个过程让我有点困惑,但据我了解,我的客户应用程序应该能够 "sign" 带有密钥的二维码信息,扫描器应用程序应该不知何故能够解码签名的二维码信息?
想到的另一件事.. 如果我在 App Store 的应用程序中存储一些私有的东西,比如密钥,有人能够破解我的代码并找到它吗?如果是这样,我应该如何在应用程序中隐藏我的 "key"?
非常感谢。
您发布了几个问题。我将回答有关实际二维码安全性的问题。我不会就如何安全地将密钥存储在应用程序中或如何在 Swift.
中实现这些问题给出答案。据我所知,您链接的文本与生成二维码有关,这不是您面临的问题。您可以根据需要使 QR 码的生成尽可能复杂和安全 - 最终输出始终是您可以复制的图像。
因此我有两个想法:
1。使二维码动态化
简单的想法:在二维码中包含当前时间戳和客户 ID,并让服务器验证时间戳是否接近当前时间戳。这有效地防止了某人简单地复制您的二维码,因为副本仅在几秒内有效。但是有人可以只分析代码中的数据并创建一个自定义代码,它始终输出其他人的代码及其客户编号和时间戳。
这归结为使代码的生成安全/可靠,这基本上就是链接文本的目的。
2。使用某种双向授权
业务员扫码后,立即向客户发送确认推送消息。如果客户按下“确定”或使用某种其他类型的确认,您可以确定二维码确实是站在员工面前的用户的二维码。
工作流程是
- 客户端显示二维码
- 业务员扫码,app联系服务器
- 服务器向客户端发送推送通知phone
- 客户端收到推送通知,调用服务器确认
- 企业员工收到来自服务器的确认并且准备就绪
我会推荐第二个选项,因为它看起来非常合乎逻辑,非常直接且易于理解。
但是我丝毫不保证它真的是安全的,因为我不是安全工程师。
此外,对于第二种方式,您可以这样做:
1-在客户端的二维码页面上,从服务器获取唯一码并显示为二维码
2-业务员扫码,app联系服务器授权码
完成了。
- 独特的代码可以有大约 2 分钟的有效期。
- 在客户端的二维码页面,您可以每2分钟刷新一次二维码
- 二维码可以是简单的MD5:D