Wi-Fi(802.11)重放攻击:自制ESP8266手机控制门锁的安全问询
Wi-Fi门锁的重放攻击风险与防护方案
嘿,这个问题问得特别到位——完全有可能被实施重放攻击,而且门槛并不高,我来给你拆解下风险根源和对应的解决思路:
为什么重放攻击可行?
不管你用的是固定参数的GET请求,还是WebSocket里的特定字符串,本质上你的ESP8266只认「收到了这个特定内容」,而不验证请求的合法性:
- 攻击者只要在你开锁的瞬间,用Wireshark这类抓包工具捕获到这个明文传输的数据包,不需要理解内容是什么,直接把数据包原封不动地重新发给ESP8266,就能触发开锁操作。毕竟你的设备不会检查这个请求是不是「刚从合法手机发出来的」。
快速落地的基础防护方案
如果想快速填补这个漏洞,这两个方法成本最低:
- 使用一次性随机令牌(Nonce):手机每次连接ESP8266的AP后,先向服务器请求一个唯一的随机字符串(比如16位的随机数字+字母组合);发送开锁请求时必须带上这个令牌,ESP8266验证令牌有效后执行开锁,同时立即作废这个令牌,下次请求必须重新获取新的。这样就算攻击者抓到旧数据包,里面的令牌已经失效,重放也没用。
- 添加时间戳验证:在开锁请求里加入当前时间戳,ESP8266收到请求后先检查时间戳是否在当前时间的±30秒(可根据需求调整)范围内,超出范围直接拒绝。就算数据包被捕获,过了这个时效窗口就无法重放。注意ESP8266本身没有实时时钟,每次手机连接时可以同步一下当前时间,或者用相对时间戳(比如手机连接后的秒数)。
进阶高安全性方案
如果想要更可靠的防护,可以考虑这些方案:
- HMAC签名验证:手机和ESP8266预先共享一个只有你们知道的密钥(比如32位的随机字符串)。发送开锁请求时,手机把「开锁指令+时间戳+随机令牌」用这个密钥生成HMAC哈希值,把哈希值一起发给ESP8266;ESP8266收到后用同样的参数和密钥计算哈希,对比一致才执行开锁。这样就算攻击者抓到数据包,没有密钥也无法生成有效的签名,重放或篡改请求都无效。
- 切换到HTTPS/WSS加密通信:给ESP8266配置自签名SSL证书(手机端手动信任即可),让所有通信都加密传输。这样攻击者无法明文捕获到请求内容,自然也就没法实施重放攻击。虽然ESP8266性能有限,但家用门锁的请求频率极低,这点负载完全可以承受。
额外的辅助防护手段
除了通信层面的防护,还可以加一些补充措施:
- 添加本地确认机制:比如开锁前ESP8266触发蜂鸣器提示,或者手机端需要先完成指纹/面部识别再发送请求,就算重放攻击成功,也能让你及时发现异常。
- 限制请求来源MAC:ESP8266只允许预先录入的手机MAC地址发送开锁请求。不过MAC地址可以被伪造,只能作为辅助防护,不能单独依赖。
内容的提问来源于stack exchange,提问作者Tareq Sulaiman




