我正在尝试在 iPhone 应用程序和 Arduino 服务器之间建立安全协议。目标是 iPhone 应用程序向 Arduino 服务器发出请求,并且服务器仅在它具有一种或另一种形式的正确凭据时才处理它。我不确定如何解决这个问题。任何建议都非常感谢!
2 回答
不幸的是,Arduino 上没有真正安全的通信选项。基本问题是 SSL 库尚未移植到该平台,部分原因是该平台构建的 8 位处理器不是很强大。话虽如此,有些事情你可以做,但你必须自己做:
基本访问身份验证是控制对 HTTP 页面的访问的一种非常不安全的方法,因此不推荐使用。 另一方面,摘要访问身份验证采用单向加密编码(散列)。它只需要 MD5 库,实际上可用于 Arduino。您需要做的是修改Web Server类的源代码以支持摘要访问身份验证:AFAIK 它不支持开箱即用。
如果这看起来很困难,您可以自己实现一些相当基本的(并且不是很安全,但总比没有好)。它可能看起来像这样:
- 第一个 GET 请求来自客户端
- 服务器以“未授权”响应进行响应,在响应中嵌入与请求 IP 地址(可能是哈希)相关的令牌。您也可以将原始时间框架作为散列的一部分,并为此类令牌提供有限的生命周期。
- 如果来自同一 IP 地址的下一个请求包含基于某个密码的哈希 + 发送的令牌,则接受下一个请求。
现在这不会保护您免受 IP 地址欺骗以及我可能没有想到的许多其他事情。然而,它会给你一点安全感(如果你相信这种事情,它会给你一点点安全感(如果你相信这种事情的话)。您可以要求(稍微)更详细的超级用户方案
您也许可以只使用基于共享机密的经过身份验证的消息。消息将包含 [至少] 消息类型、消息正文、时间戳和消息摘要。您通过使用共享密钥对其他内容进行 HMAC 处理来创建摘要。(将 HMAC Arduino 输入 Google 以获取库和代码。)消息通过 TCP 或 UDP 发送(我更喜欢它)。Arduino 计算消息摘要,检查它,验证数据,然后对消息进行操作。
我喜欢做的一件事是在应用服务器前面的网络层实现端口敲门或其他东西。这可以防止不需要的流量到达自定义(并且可能是易受攻击的)命令服务器。这可以悄悄地完成(参见静音敲门)或明显地完成。网络保护也可以通过专用设备来实现,该设备可以在大量流氓流量到达 Arduino 之前执行繁重的工作并取消其资格。