“我在那里”创建由 Azure Sphere 设备签名的安全临时 QR 令牌(JSON Web 令牌)以供以后验证。
问题
在许多情况下,我们必须表明我们曾在某个地点和某个时间出现过。
我们不希望用户必须事先被识别,因此身份证(磁卡、芯片卡、非接触式卡或带有 NFC 标签的智能手机)等解决方案不值得我们使用。也不值得使用生物特征识别的解决方案。
典型用例
解决方案
IWT (I Was There) 生成带有日期标记的 QR 码,该标记独立于人,经过签名且是唯一的,以避免对其进行修改,以保证该标记以后未被修改。
IWT 的原型实施,用于奖励回收公民的计划:
它是如何工作的
或者,该设备可以生成一个听不见的声音信号,该信号可以用任何录音设备录制(实施待定)。
挑战
在解决方案的设计过程中,我遇到了几个影响最终解决方案的问题:
克服障碍
我的第一个决定是尝试合并一个加密处理器模块来执行加密、签名和存储加密密钥。不幸的是,我仍然没有按时收到密码模块,不得不选择软件解决方案。
硬件
硬件包括安富利 Azure Sphere MT320 入门套件开发套件和 Waveshare 1.54 英寸电子纸模块电子墨水显示器。
Microsoft Azure Sphere 解决方案的优势
Avnet Azure Sphere MT320 入门套件
微雪1.54寸电子纸模组电子墨水屏
软件设计
状态图
用户界面
空闲屏幕
在空闲状态期间,屏幕显示按下 A 按钮以获取新 QR 的指示
奖励画面
如果收到下一个 QR 的新奖品状态,则按下按钮 A 后,将显示与 QR 关联的奖品。客户忠诚度计划的选项。
二维码屏幕
然后是包含签名的 JWT 令牌的新 QR 码。从 Azure 云中设置的时间将处于此状态。
时钟屏幕和设置
按下 B 按钮时,会显示带有设备当前时间的时钟,如果再次按下,则会显示应用程序设置。
JWT 令牌 QR 剖析
QR 码包含此字符串:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJlMmRhNzc3My1hN2NkLTQ0YTAtODVkNy00M2ZlMDY1NGNiMjItN2RjNTQ4MTEtNWRjYjBjNzAiLCJpYXQiOjE1NzM1ODgwODB9.Dm8qKzv5n0EHMCcIECn08Ev_eppzPNc-hGtuICCNGK0
它是一种紧凑形式的 JSON Web 令牌。JWT 通常如下所示:xxxxx.yyyyy.zzzzz
JSON Web Token (JWT) 是一种紧凑的 URL 安全方式,用于表示要在两方之间传输的声明。JSON Web Token (JWT) 是一个开放标准 (RFC 7519)。JWT 中的声明被编码为 JSON 对象,用作 JSON Web 签名 (JWS) 结构的有效负载或用作 JSON Web 加密 (JWE) 结构的明文。此信息可以被验证和信任,因为它是经过数字签名的。JWT 可以使用秘密(使用 HMAC 算法)或使用 RSA 或 ECDSA 的公钥/私钥对进行签名。https://tools.ietf.org/html/rfc7519
它由以点(.)分隔的三部分组成,分别是:
这三部分的内容都是Base64Url编码的。对上述token的三部分进行解码:
Header :声明编码对象是一个 JSON Web Token,并且它是使用 HS256 算法签名的。
{
"alg": "HS256",
"typ": "JWT"
}
Payload /Claim :我们正在使用两个已注册的声明名称。在 JWT 的上下文中,声明可以定义为关于实体的声明,以及关于令牌本身的附加元数据。服务器可用于正确处理 JSON Web Token 身份验证的声明和声明。我们可以提供多种索赔;这些包括已注册的声明名称、公共声明名称和私人声明名称。
{
"jti": "e2da7773-a7cd-44a0-85d7-43fe0654cb22-7dc54811-5dcb0c70",
"iat": 1573588080
}
https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-10.1
签名:数字签名或消息验证代码 (MAC)。
https://tools.ietf.org/html/rfc7515
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
[your-256-bit-secret]
)
Azure sphere 不提供 API 来为来自 A7 和/或 M4 子系统的加密函数调用获取硬件支持/加速。所以我们正在使用 wolfSSL 嵌入式 SSL 库(以前称为 CyaSSL)
狼SSL
wolfSSL 嵌入式 SSL 库(以前称为 CyaSSL)是一个用 ANSI C 编写的轻量级 SSL/TLS 库,适用于嵌入式、RTOS 和资源受限环境——主要是因为它的体积小、速度快和功能集。由于其免版税定价和出色的跨平台支持,它也常用于标准操作环境。wolfSSL 支持当前 TLS 1.3 和 DTLS 1.2 级别的行业标准,比 OpenSSL 小 20 倍,wolfSSL 由 wolfCrypt 库提供支持。
https://github.com/wolfSSL/wolfssl/tree/master/IDE/VS-AZURE-SPHERE
键控哈希 HMAC
wolfCrypt 目前提供 HMAC 来满足消息摘要的需要。结构 Hmac 位于标题“wolfssl/wolfcrypt/hmac.h”中。
HMAC 初始化是用 wc_HmacSetKey() 完成的。对于我们使用 HMAC SHA-256 的项目
标头
{"alg":"HS256","typ":"JWT"}
BASE64 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
BASE64URL eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
有效载荷
{"sub":"1234567890","name":"John Doe","iat":1516239022}
BASE64 eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ==
BASE64URL eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
验证签名
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
0123456789ABCDEF0123456789ABCDEF )
结果是:
HMACSHA256(eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ,
0123456789ABCDEF0123456789ABCDEF)
最后:
HEX A650E04A6412F8B67A06942E513556D35C9BE22FC8EA12D92970AACFB76B6EED
HEX2B64 plDgSmQS+LZ6BpQuUTVW01yb4i/I6hLZKXCqz7drbu0=
B642B64URL plDgSmQS-LZ6BpQuUTVW01yb4i_I6hLZKXCqz7drbu0
编码令牌
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
.plDgSmQS-LZ6BpQuUTVW01yb4i_I6hLZKXCqz7drbu0
hmac hmac;
byte key[24]; /*fill key with keying material*/
byte buffer[2048]; /*fill buffer with data to digest*/
byte hmacDigest[SHA256_DIGEST_SIZE];
wc_HmacSetKey(&hmac, SHA256, key, sizeof(key));
wc_HmacUpdate(&hmac, buffer, sizeof(buffer));
wc_HmacFinal(&hmac, hmacDigest);
hmacDigest 现在包含缓冲区中散列数据的摘要。
我们正在使用 Richard Moore QR Code 库,这是一个用 C 语言生成 QR 码的简单库,针对处理和内存受限系统进行了优化。
特征:
https://github.com/ricmoo/QRCode
实施步骤
资源
监控 Qr 请求
每当新的每周 QR 码异步发布到 Azure 云时,在构建应用程序时发送到 Azure IoT Central 或 Azure IoT Hub。
下图中看到的点对应于按下 A 按钮后或当簧片开关检测到从打开到关闭的步骤时生成 QR 码的事件。
我们可以看到带有生成的 QR ID 的事件的详细列表视图。
编程显示新消息
新的奖励或信息消息可以从 IoT Central 编程或完全禁用。
获取设备信息
特性
Key Value
userLedRed true | false enables/disables the red LED of the user RGB LED
userLedGreen true | false enables/disables the green LED of the user RGB LED
userLedBlue true | false enables/disables the blue LED of the user RGB LED
appLed true | false enables/disables the application LED
wifiLed true | false enables/disables the WI-FI LED
Waveshare 1.54inch e-Paper V2概述
1.54英寸电子纸V2是一款有源矩阵电泳显示器(AMEPD),具有接口和参考系统设计。1.54”活动区包含200×200像素,具有1位黑白全显示能力。集成电路包含栅极缓冲器、源极缓冲器、接口、时序控制逻辑、振荡器、DC-DC。SRAM.LUT、VCOM 和边框随每个面板提供。
https://www.waveshare.com/wiki/1.54inch_e-Paper_Module
引脚图
此表显示了 eINK click 上的引脚分配如何对应于 mikroBUS™ 插座上的引脚分配(后者显示在中间的两列中)。
单击 Socket #1 引脚分配
源代码引脚定义
#define AVT_MODULE_GPIO31_SCLK1_TXD1 (GPIO_Id)31
#define AVT_MODULE_GPIO32_MOSI1_RTS1_CLK1 (GPIO_Id)32
#define AVT_MODULE_GPIO33_MISO1_RXD1_DATA1 (GPIO_Id)33
#define AVT_MODULE_GPIO34_CSA1_CTS1 (GPIO_Id)34
#define EPAPER_DC (GPIO_Id)0
#define EPAPER_BUSY (GPIO_Id)2
#define EPAPER_RESET (GPIO_Id)16
#define EPAPER_SCLK AVT_MODULE_GPIO31_SCLK1_TXD1
#define EPAPER_MOSI AVT_MODULE_GPIO32_MOSI1_RTS1_CLK1
#define EPAPER_CS AVT_MODULE_GPIO34_CSA1_CTS1
通讯协议
SPI接口
与传统的SPI协议不同,从机到主机的数据线是隐藏的,因为设备只有显示需求。
CS为slave片选,当CS为低电平时,芯片使能。(CS#) 是连接到 MCU 的片选输入。该芯片启用 MCU 通信:仅当 CS# 被拉低时。
DC为数据/命令控制引脚,DC=0时写命令,DC=1时写数据。(D/C#) 是连接到 MCU 的数据/命令控制引脚。当引脚被拉高时,数据将被解释为数据。当引脚被拉低时,数据将被解释为命令。
SCLK 是 SPI 通信时钟。
SDIN是SPI通信中主机到从机的数据线。
(RES#)为复位信号输入。复位为低电平有效。注 1.5-4:此引脚(BUSY)为忙状态输出引脚。当 Busy 为高电平时,芯片的运行不应中断,也不应向模块发出任何命令。当驱动 IC 工作时,驱动 IC 会将 Busy 引脚置为高电平,例如: - 输出显示波形;或 - 与数字温度通信。
(BS1) 用于 3 线 SPI 或 4 线 SPI 选择。当它为“低”时,选择 4 线 SPI。当它为“高”时,选择 3 线 SPI(9 位 SPI)。
SPI通信有数据传输时序,由CPHA和CPOL组合而成。
SPI有4种通信模式。常用SPI0,其中CPHL=0,CPOL=0。
数据传输在SCLK的第一个下降沿开始,在一个时钟周期内传输8位数据。这里使用SPI0,数据按位传输,MSB在前。
除了在按下按钮时启动新的二维码之外,我们还可以在它检测到用户何时使用接近传感器使用回收容器时激活它。
#define AVT_MODULE_GPIO42_ADC1 MT3620_GPIO42
#define AVT_SK_CM1_AN AVT_MODULE_GPIO42_ADC1
#define PROXIMITY_GPIO AVT_SK_CM1_AN
我们使用干簧管和磁铁来检测用户是否打开了容器门。
我们将使用的簧片开关是常开的。我们有两种选择来检测门何时完全关闭或门何时完全打开。对于这个项目,我们将使用第一个替代方案:
检测门完全关闭:当门关闭时,磁铁使干簧管闭合,并一直处于该状态,直到门被打开。我们将干簧管接地,然后通过 4.7K 拉高 GPIO 引脚 42。在关闭状态下将读取低。当从高到低时,将发送新 QR 的事件,即当门再次完全关闭时,奖励用户在使用后关闭门 :D。
验证二维码
从带有 QR 扫描仪的 Android 设备:
验证 JWT
使用 JWT 调试器验证签名:https ://jwt.io/#debugger
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !