【问题标题】:Secure communications between Java server and Arduino clients: need a suggestionJava 服务器和 Arduino 客户端之间的安全通信:需要一个建议
【发布时间】:2013-03-06 00:34:49
【问题描述】:

有一个 Java 服务器和许多 Arduino 设备,它们通过 TCP 连接连接。我们可以使用的板:Arduino UnoArduino Mega 2560

每个 Arduino 设备实际上都是报告器(例如,它从水表获取数据并将数据传输到服务器)或某些设备的某种远程控制。

目前,此连接不安全。我需要确保它的安全,即实施 VPN。

我在这个知识领域是全新的,我正在尝试找出我应该使用的方式。

我真的希望我能找到一些协议的现有实现,并将其构建到这个系统中。

但是哪个协议呢?

我已经发现我不能使用 IPSec,因为 TCP/IP 堆栈是在这些 Arduino 设备中硬件实现的,所以我们不能修改它。

因此,我需要使用一些比 TCP 更高的协议,并且我需要用 C(用于客户端设备)和 Java(用于服务器)实现。

我正在尝试查找 SSL、PPTP、L2TP 或其他我仍然不知道的实现。

如果有人有这方面的经验,我很乐意看到你的建议。

【问题讨论】:

  • 如果你有一个固定的服务器,你可以通过将公钥硬编码到你的 Arduino 中(而不是协商密钥)大大简化你的问题,然后执行通常的 SSL 技巧:生成本地密钥以对数据进行编码,并通过使用公钥加密发送密钥的加密版本。如果数据不是太大,您甚至可以直接使用公钥进行编码。我猜你只需要保证数据的安全 - 这实际上比“完整”VPN连接的能力要小......
  • 是的,您猜对了:我只需要确保数据安全。感谢您的提示!
  • @Floris,您能否详细说明“小于完整 VPN 连接的能力”?与我的需求相比,它有什么关键区别:使数据安全?当然,我在问之前用谷歌搜索过,但正如我所见,VPN 的目的是为安全的数据交换建立“隧道”。而且我无法说明 VPN 和使数据安全的具体区别。

标签: java c encryption arduino vpn


【解决方案1】:

我非常同意 @Floris。添加一些想法:

  • HTTP 怎么样?如果您的通信是单向的(Arduino -> PC),那么它应该足以满足您的需求。这个问题在this 帖子中进行了讨论,并参考了this 讨论。 Arduino 上的 HHTP 并不容易,但它可能已经完成了。

  • 显然,XXTEA 是另一种选择,关于这个主题也有几个 stackoverflow 问题。

  • 1234563 SE post:你只担心中间人攻击吗?如果有人撕开您的设备并打开读取密钥怎么办,这是一个问题吗?

【讨论】:

  • 感谢您的回答。需要详细说明:为什么 HTTPs 足以用于单向通信,但不能用于双向通信?而且,另一个问题:通过 HTTPS,您的意思是仅使用 SSL/TLS,对吗? (目前,没有使用 HTTP,只有通过 TCP 连接的简单文本协议)而且,关于翻录设备:不,目前我不担心。
  • 好吧,我对单向与双向的想法是,除了请求-响应之外,实现涉及状态的那种通信协议可能更难。是的,在 HTTPS = SSL/TLS 上:似乎 HTTPS 无处不在,用于 HTTPS 目的的 SSL/TLS 比其他任何东西都更有可能实现。当然,您是对的,如果有针对 Arduino 的通用 SSL 实现,那么您将不限于 HTTPS。
【解决方案2】:

对您的后续问题的回复过长...

VPN 通常会在基础设施(例如大学计算机系统)中创建“隧道”。也就是说,VPN 集中器“位于大学网络的外围”,当您连接到 时,您会创建一个“通道”进入防火墙后面的系统 - 任何协议、任何 IP防火墙内的地址变得可访问。关键是,任何观察从您的计算机到集中器(也称为“VPN 网关”)的流量的人只能看到您与集中器通信 - 他们不知道您正在与防火墙内的哪些 IP 地址进行通信,使用什么协议,或者什么数据。相比之下,如果您不需要隐藏所有内容,则只需加密数据本身即可;一个简单的加密算法很容易实现,特别是如果您不需要担心人们会窃取您的设备并获取代码。加密的复杂程度取决于您的应用程序 - 在速度、内存使用和安全性之间进行权衡。

咕咕咕。 le “Arduino 加密库” 用于一些示例;选择一个密钥,然后加密你的数据,然后POST它......

让我们知道你是怎么做到的!

【讨论】:

  • 非常感谢!当我完成它时,我一定会告诉你的。
  • 现在看来已经完成了,所以,我确实是这样做的:真的,我还没有实现 SSL 或其他 VPN,我使用的是 Rabbit 密码 (en.wikipedia.org/wiki/Rabbit_%28cipher%29) 并且只是一个简单的会话初始化:每个设备都有其唯一的 ID 和硬编码的密钥对/IV(初始向量);服务器有带有 ids 和这些 pars 的数据库。客户端将其 ID 以纯文本形式发送给服务器,服务器生成新的密钥/IV 对,通过硬编码的密钥/IV 对其进行加密,然后发送给客户端。因此,使用这些生成的密钥对/IV 进行进一步的通信。
  • 很高兴您能从一些建议中自己弄清楚!感谢您抽出宝贵时间报告您是如何解决它的。
  • 如果有人监听到通信,删除了服务器返回的消息会怎样?
  • @bubblebath - 你是什么意思?通信将被加密,那么“有人在听”a)如何知道返回消息是什么,以及 b)他们如何删除它?如果消息已发送但未收到,通常会重新发送(这就是 TCP/IP 的工作原理……)。听的人怎么能删除呢?
【解决方案3】:

Here 被描述为 Arduino/AVR 设备的 [CHAP] (en.wikipedia.org/wiki/Challenge-Handshake_Authentication_Protocol) 的实现。

here 被描述为 Arduino/AVR 的 [HMAC] (en.wikipedia.org/wiki/Hash-based_message_authentication_code) 和 [SHA256] (en.wikipedia.org/wiki/SHA-2) 的类似实现.

[Cryptosuite] (github.com/wgoulet/Cryptosuite) 是 Arduino 的 HMAC-SHA-256 实现。

最后,[here] (github.com/arpitchauhan/cryptographic-protocols-arduino-and-PC) 演示了一些 Arduino 的加密协议,包括使用 RSA 的密钥交换。

所以绝对有可能确保 Arduino 和服务器之间的通信安全。

【讨论】:

  • 欢迎来到 Stack Overflow!虽然用链接补充您的答案可能非常有帮助,但请确保您的答案有足够的信息来独立存在,以防这些链接加载失败。
猜你喜欢
  • 2012-03-22
  • 2011-08-22
  • 1970-01-01
  • 2014-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多