无联网设备如何通过QR码/移动设备完成用户认证以替代硬件密钥?
思路偏差说明
你最初的方案确实存在核心逻辑错误:混淆了加密体系的密钥使用规则,本应严格保密的私钥/共享密钥绝对不能通过公开可获取的QR码URL参数传输,这相当于直接把认证凭证公开给所有人,自然无法防范攻击者自行生成通行码。
可行解决方案
方案1:非对称数字签名方案(安全性更高,推荐)
- 提前预置密钥:离线设备出厂/初始化时,内置唯一非对称密钥对的公钥,对应的私钥仅存储在Web认证服务的可信环境中,全程不对外暴露。
- 离线设备生成QR码时,URL参数仅携带三个公开信息:不可重复的随机挑战值、设备唯一ID、请求有效时长,不涉及任何密钥内容。
- 用户扫码跳转Web端完成身份校验后,Web服务用对应私钥对「设备ID+随机挑战值+用户ID+有效期戳」的组合字符串做数字签名,将签名结果和必要的公开信息拼接为短字符串通行码。
- 用户将通行码输入离线设备后,设备用本地存储的公钥验证签名合法性,同时校验随机挑战值是否为自己之前生成的未使用值、有效期是否未超时,全部校验通过即可完成身份认可。
方案2:对称HMAC方案(轻量化,适合算力有限的低端离线设备)
- 提前给每台离线设备预置唯一的对称共享密钥,该密钥仅离线设备和Web认证服务各自存储,全程不对外传输。
- QR码参数同样仅携带随机挑战值、设备ID、请求有效期三类公开信息,不涉及密钥。
- Web端用户认证通过后,调用对应设备的共享密钥,对「随机挑战值+用户ID+有效期戳」做
HMAC哈希计算,将哈希值截断为6~8位短字符串作为通行码。 - 离线设备用本地存储的共享密钥执行完全相同的HMAC计算,将结果和用户输入的通行码比对,一致且校验随机挑战、有效期合法即可通过。
共享密钥设计核心规则
共享密钥永远不要通过URL、QR码等公开信道传输,仅在设备初始化阶段写入离线设备的安全存储区和Web服务的加密数据库中,且每台设备的密钥唯一,即使单台设备密钥泄露也不会影响全局安全。
安全增强建议
- 随机挑战值每次生成必须保证不可预测,且仅允许使用一次,防范重放攻击。
- 通行码有效期建议设置为5~15分钟,即使被截获也无法长期使用。
- 通行码支持两种输出形式:短字符串供用户手动输入,或者生成QR码供离线设备直接扫码读取,提升使用体验。
内容的提问来源于stack exchange,提问作者cjk94
相关产品推荐
相关产品推荐

