如何保护应用程序和物联网设备之间的通信?

物联网 安全 蓝牙 移动应用
2021-05-29 22:59:44

我目前正在开展一个项目,该项目包括移动应用程序(当前使用 Ionic 平台)和嵌入式设备之间的蓝牙通信。为了比较,我们的产品类似于智能锁

安全是我们最关心的问题,我们正在寻找方法来确保我们的硬件和软件不会被黑客入侵。我们应该采取哪些步骤来确保我们的系统安全?

编辑:是的,我们目前正在加密通信,并在设备与我们的服务器通信时使用 HTTPS。

2个回答

为了确保您的设备足够安全,我有几个提示:

  1. 为蓝牙通信添加一些加密。我建议不要使用加密密钥。例如,您可能会要求用户在移动应用程序的初始设置时扫描设备上、包装盒中打印的二维码,也许使用 AES 密钥?由你决定。这是为了防止有人看到以纯文本形式传输的密码。
  2. 如果可以,请远离您选择的加密算法的 ECB(使用 CBC)模式,因为它可能会提供有关传输数据的一些信息。可以在此处找到更多信息
  3. 在蓝牙数据传输中,请确保包含一些唯一的 ID,以便消息不能重复(例如,您可能包含时间戳)。您还可以实现一些类似于 TOTP 的系统。
  4. 在设备上放置一个端口,使其可以轻松刷入,以防万一您意识到软件有错误(并且由于某种原因您无法 OTA 更新),该设备不是昂贵的镇纸,只是一个设备需要插入PC并刷入新软件。
  5. 额外:为了确保拥有流氓根证书(可能是自行颁发并安装在客户端设备上)的人无法拦截您的服务器通信,请验证 HTTPS 证书。这是一个针对 Android 的 SO,您也必须能够为 iOS 找到类似的资源

此外,如果您想了解有关用于保护设备的密码学和加密的更多信息,请查看此(免费)电子书它谈论了很多关于加密算法的好坏实现,应该可以帮助您保护您的产品。(注 1:请不要创建自己的算法。注 2:我不隶属于 crypto101 或 lvh。)

如果您可以使用端到端 TCP,那么请使用端到端 TLS(例如使用 HTTPS)。

不要重新发明轮子,尤其是在密码学方面——大多数人都弄错了。除非设备资源太紧而无法支持 TLS,否则如果您降到 AES 级别,那么您就做错了#1 错误是加密而忘记验证——如果你的服务器和中间人之间有一个加密的通道,而不是你的服务器和你的设备之间的加密通道,那么加密没有提供任何好处. 如果您不能使用 TLS,请确保您使用的任何协议都能所有内容进行身份验证,并对需要保密的内容进行加密。

要安全地使用 TLS,请从每个参与者的角度考虑您需要拥有哪些保证。通常,设备需要知道它正在与合法服务器通信。这意味着它必须检查服务器的证书。设备必须具有记录为受信任的证书颁发机构的 X.509 证书;这需要攻击者无法修改的存储,但它不需要存储的任何机密性。请注意,您不应直接对服务器的证书进行硬编码,因为如果该证书遭到破坏,您将无法轻松替换该证书。相反,设备存储预期的身份服务器的(主机名),以及保证某个公钥属于预期主机名的证书颁发机构的证书。再次强调,不要重新发明轮子,依靠 TLS 库或应用程序提供的证书检查。

如果服务器需要知道它正在与一个合法的客户端交谈,那么每个客户端都需要有自己的客户端证书。这需要在客户端上进行机密存储。将客户端证书从您的 TLS 库传递给 TLS 会话打开函数,或在应用程序配置中进行设置。

这可以确保您的服务器和设备之间的通信安全。如果移动应用程序可以直接与设备通话(例如允许在本地wifi网络上断开连接的操作),您需要先在智能开关和手机之间进行配对。配对意味着密钥的交换,如果资源允许,最好是公钥的交换,否则是秘密密钥的协议。这种配对的目标是确保每个设备都知道它在与谁通话。

您还需要保护控制通道,无论它是直接从移动设备连接到智能交换机还是通过服务器。考虑授权:是否有不同级别的交换机访问权限,例如允许重新配置的控制级别和只允许开/关切换的基本通道?这通常由建立安全通道(如果可能,TLS)后的身份验证步骤处理。

另一个考虑因素是固件更新。这是一个棘手的问题:一方面,没有绝对安全这样的东西,因此您将不时应用安全补丁。另一方面,固件升级机制是一件复杂的事情,本身可能有错误。至少,请确保您的固件升级已签名。纯粹依赖通信通道的安全性进行升级是不可靠的,因为安全通道的可信基础大于静态安全验证,有时您可能希望在没有网络连接的情况下应用固件更新。除了验证签名外,理想情况下你应该有一些防止回滚的保护,这样对手就可以'