如何快速安全地将物联网应用程序连接到Google Cloud

企业级云服务(如Google Cloud)为物联网开发人员提供了从可扩展虚拟机服务到交钥匙人工智能(AI)应用程序的各种功能。这些服务的基本要求是使用特定的安全方法来建立和维护物联网设备与云之间的安全连接。但是,对于开发人员而言,实施适当的安全机制可能会导致延迟并增加设计项目在紧迫的期限内运行的复杂性。
Microchip TechnologyPIC-IoT WG开发板采用专用安全IC构建,为Google Cloud连接提供交钥匙解决方案。该套件使用专用安全IC,提供了一个全面的平台,旨在加速物联网设计的开发,从而安全地连接到Google云服务。本文介绍了安全连接的关键要求,并展示了开发人员如何在典型的物联网设计中使用PIC-IoT WG满足这些要求。

安全复杂性

保护物联网设备和远程主机服务器之间的连接的能力是物联网应用程序和相关网络企业资源的整体保护的基础。这些服务器和其他企业级系统可以提供功能和性能,这些功能和性能在使用资源有限的微控制器和最小内存构建的物联网设备中完全不可用。对于期望提供传感器数据或及时操作执行器的简单物联网设备,由于其性质,仅用于实现甚至最基本的安全算法的处理要求可能是令人望而却步的。
安全方法依赖于基本原则,即穿透安全屏障应该比屏障旨在保护的资产更昂贵。对于算法安全方法,这意味着解密加密消息或破坏认证协议应该在计算上是禁止的。至少,破坏算法安全性应该要求一定水平的计算资源和所需时间超过受保护数据或通信信道的值或及时性。因此,加密算法试图将有价值的数据埋藏在涉及秘密密钥的一系列复杂的,计算密集的处理步骤之下。例如,广泛使用的高级加密标准(AES)算法将数据托管到多个处理轮次,
加密算法图有目的地采用一系列复杂的操作
图1:加密算法旨在使解密变得不切实际且实际上不可能,故意采用一系列复杂的操作,例如AES算法中的这一步骤,该算法将数据与从私钥导出的比特组合在一起。(图片来源:Wikimedia Commons)
对于诸如AES的对称加密算法,加密消息的接收器使用相同的密钥来解密数据。相反,非对称算法使用一对密钥,一个私有密钥和一个公共密钥,消除了与使用共享密钥相关的风险,代价是计算复杂度更高。在这种方法中,发送者和接收者交换公钥,同时保持他们自己的私钥是秘密的。反过来,一方可以使用另一方的公钥来加密只能使用另一方的私钥解密的消息。
为了进一步保护,高级算法建立在非对称公钥加密方法之上,以允许在特定消息交换会话期间安全地交换用于加密数据的短期共享私钥。由于这些关键交换的关键性质,更先进的算法,如椭圆曲线Diffie-Hellman(ECDH),在复杂的椭圆曲线计算下更深入地掩盖了秘密。诸如传输层安全性(TLS)之类的认证协议将诸如Diffie-Hellman密钥交换之类的机制与正式识别方法相结合,使用数字证书嵌入具有来自证书颁发机构(CA)的可验证数字签名的公钥,证明证书的真实性。 。
正如此简要说明所示,安全方法依赖于最终依赖私钥的加密算法和协议层。虽然这些层受到黑客的持续攻击,但如果可以发现私钥,整个安全结构将很快崩溃。
因此,基于硬件的安全密钥存储是物联网设备安全性的基本要求。此外,这些算法和协议的计算复杂性决定了对能够从资源有限的微控制器卸载复杂计算的专用加密引擎的需求。

基于硬件的安全性

专有的安全元件硬件设备,如Microchip Technology ATECC608A CryptoAuthentication IC,可提供保护机密和加速加密算法执行所需的功能。ATECC608A的功能包括片上EEPROM,可安全存储多达16个密钥,证书和其他数据,以及其他必要功能,包括符合NIST SP 800-90A / B / C标准的随机数发生器。
ATECC608A不仅是一种安全的存储设备,还可以加速多种算法的执行,包括用于对称加密的AES和用于非对称加密的ECDH。该器件还支持更高级别的服务,包括安全启动(请参阅“ 使用加密芯片为IoT设备设计添加安全启动 ”)。
除了通过卸载这些算法的执行所获得的直接性能优势之外,ATECC608A还集成了这些加密引擎,安全存储和其他功能,从根本上提供了另一层安全性:密钥与不受信任的实体保持隔离。这些实体包括不是为安全性而设计的微控制器,在微控制器上运行的软件以及使用该软件的个人。设备生成私钥的能力在制造或分销设施的配置期间提供了进一步的安全性。
与传统的基于软件的安全方法相比,结果是减少了威胁向量的数量。这支持了有效安全策略核心的那种纵深防御。
这种ATECC608A功能的全面集成简化了硬件接口要求。该器件作为另一个I 2 C外设运行,甚至可以与其他器件共享微控制器的I 2 C总线,如Microchip Technology的MCP9808等数字传感器(图2)。
Microchip Technology ATECC608A CryptoAuthentication IC图
图2:由于Microchip Technology ATECC608A CryptoAuthentication IC(左)完全在芯片上完成其安全处理,因此它可以提供简单的I 2 C硬件接口,以便与其他I 2 C器件一起使用,例如Microchip Technology的MCP9808 I 2 C数字温度传感器(对)。(图片来源:Microchip Technology)
然而,在软件层面,ATECC608A的广泛功能导致更复杂的界面。Microchip Technology的CryptoAuthLib库将此接口抽象为CryptoAuthLib应用程序编程接口(API)中提供的一组直观函数调用。该库与Microchip Technology的MPLAB X集成开发环境(IDE)中的相关驱动程序和中间件捆绑在一起。虽然CryptoAuthLib API和驱动程序为ATECC608A的定制设计提供了基础元素,但开发人员在实现与Google Cloud的安全连接所需的完整安全链方面面临着额外的挑战。Microchip Technology的PIC-IoT WG开发板也消除了这一障碍。

开发端到端的物联网应用程序

PIC-IoT板基于ATECC608A和Microchip Technology的低成本PIC24FJ128GA705 16位微控制器,是一种无线物联网设计,包括Microchip Technology ATWINC1510 Wi-Fi模块,Vishay Semiconductor的 TEMT6000X01环境光传感器和MCP9808 I 2 C温度感应器。此外,开发人员可以通过添加数百个MikroElektronika Click板提供的传感器和执行器,轻松扩展硬件基础平台。对于软件开发,Microchip Technology提供其MPLAB X IDE和相关的MPLAB代码配置器  (MCC)快速原型开发工具。
该板和相关软件提供了一个交钥匙平台,用于评估通过安全连接从物联网传感器设备运行到Google云服务的基本端到端物联网应用。该套件实现了一种独特的方法,旨在实现相互身份验证,即使对于资源受限的IoT设备也是如此。在这种方法中,物联网设备可以使用轻量级TLS服务来验证连接的Google端和JavaScript对象表示法(JSON)Web令牌(JWT),以便向Google服务器进行身份验证(请参阅“ 更安全地连接IoT的解决方案 ”)设备到云端“)。除了器件驱动程序,板级支持包和中间件服务外,Microchip Technology还通过MPLAB开发套件将此方法演示为可用于PIC-IoT板的完整示例IoT应用程序的一部分。
通过示例应用程序开发人员,不仅可以获得云应用程序的工作经验,还可以获得主要云服务提供商提供的物联网专用服务,以便将物联网设备连接到云端。例如,物联网设备通过Google Cloud IoT Core访问Google Cloud资源,后者提供连接这些设备,管理相关元数据等所需的一系列服务(图3)。
Google Cloud图提供了专门的服务产品Google Cloud IoT Core
图3:与其他企业云提供商一样,Google Cloud提供专门的服务产品Google Cloud IoT Core,旨在支持与将IoT设备与云资源集成相关的独特要求。(图片来源:谷歌)

使用云服务

在后端,Google Cloud IoT Core使用发布/订阅(发布/订阅)模型通过数据代理为设备提供对高级Google云资源的访问。在前端,IoT Core提供了一个桥接器,支持使用超文本传输​​协议(HTTP)或消息队列遥测传输(MQTT)进行物联网设备连接。MQTT是一种国际标准化组织(ISO)标准消息传输传输,旨在以最小的通信带宽和物联网设备资源运行。Microchip Technology的PIC-IoT板软件应用程序演示了在传输控制协议/ Internet协议(TCP / IP)套接字连接上运行的MQTT,该连接使用前面描述的TLS / JWT相互认证方法进行保护。
建立安全连接后,该软件使用MQTT与Google Cloud IoT核心服务进行通信,以建立用于将传感器数据发送到Google Cloud并响应来自云服务的命令的频道或“主题”。Google要求IoT设备软件订阅并随后将数据发送到表单的指定主题,/devices/{deviceID}/events并在广泛events主题下提供子主题选项。除了设备管理功能等其他主题外,Google还指定了一个主题,/devices/{device-id}/commands用于将命令从云端发送到物联网设备。谷歌甚至提供了一个全能主题(/devices/{device-id}/commands/#),允许物联网设备接收通过任何子主题发送的命令。
PIC-IoT应用程序使用基于定时器和回调的可扩展软件架构演示了这些不同的过程。由于这种架构,主模块(main.c)只需要提供主例程(main())以及发送(sendToCloud())和接收(receivedFromCloud())消息的应用程序级例程。该main()例程本身进入在运行计时器调度器和提供了一种用于用户例程(列表1)的占位符的无限循环之前只是调用一对初始化例程。
复制 void receivedFromCloud(uint8_t *topic, uint8_t *payload) {     char *toggleToken = "\"toggle\":";     char *subString;         if ((subString = strstr((char*)payload, toggleToken)))     {         LED_holdYellowOn( subString[strlen(toggleToken)] == '1' );     }         debug_printer(SEVERITY_NONE, LEVEL_NORMAL, "topic: %s", topic);     debug_printer(SEVERITY_NONE, LEVEL_NORMAL, "payload: %s", payload); }   // This will get called every 1 second only while we have a valid Cloud connection void sendToCloud(void) {    static char json[70];             // This part runs every CFG_SEND_INTERVAL seconds    int rawTemperature = SENSORS_getTempValue();    int light = SENSORS_getLightValue();    int len = sprintf(json, "{\"Light\":%d,\"Temp\":\"%d.%02d\"}", light,rawTemperature/100,abs(rawTemperature)%100);      if (len >0) {       CLOUD_publishData((uint8_t*)json, len);       LED_flashYellow();    } }   #include "mcc_generated_files/application_manager.h"   /*                          Main application  */ int main(void) {     // initialize the device     SYSTEM_Initialize();     application_init();       while (1)     {         // Add your application code         runScheduler();     }       return 1; } 
清单1:用于PIC-IoT板的Microchip Technology示例应用程序使用一系列定时器和回调来简化主循环,并允许开发人员轻松添加自己的服务和应用程序例程。(代码来源:Microchip Technology)
在无限循环之前调用,SYSTEM_Initialize()例程初始化硬件组件,包括时钟,模数转换器(ADC),中断等。该application_init()例程初始化各种软件系统,包括CryptoAuthentication库,连接到Wi-Fi,以及云本身。作为最后一项任务,application_init()设置一个100毫秒(ms)的计时器来执行MAIN_dataTask()。当计时器到期并被MAIN_dataTask()调用时,它会检查云连接并sendToCloud()每秒调用一次,将板的LED设置为适当的,以指示应用程序的当前运行状态(清单2)。反过来,开发人员可以在Microchip Technology在Google Cloud上提供的免费沙箱帐户上查看传感器值的显示。
复制 // This gets called by the scheduler approximately every 100ms uint32_t MAIN_dataTask(void *payload) {    static time_t previousTransmissionTime = 0;       // Get the current time. This uses the C standard library time functions    time_t timeNow = time(NULL);       // Example of how to send data when MQTT is connected every 1 second based on the system clock    if (CLOUD_isConnected())    {       // How many seconds since the last time this loop ran?       int32_t delta = difftime(timeNow,previousTransmissionTime);          if (delta >= CFG_SEND_INTERVAL)       {          previousTransmissionTime = timeNow;                   // Call the data task in main.c          sendToCloud();       }    }       if(shared_networking_params.haveAPConnection)     {         LED_BLUE_SetLow();     }     else     {         LED_BLUE_SetHigh();     }     if(shared_networking_params.haveERROR)     {         LED_RED_SetLow();     }     else     {         LED_RED_SetHigh();     }     if (LED_isBlinkingGreen() == false)     {         if(CLOUD_isConnected())         {             LED_GREEN_SetLow();         }         else         {             LED_GREEN_SetHigh();         }     }       // This is milliseconds managed by the RTC and the scheduler, this return makes the    //      timer run another time, returning 0 will make it stop    return MAIN_DATATASK_INTERVAL; } 
清单2:使用定时器和回调机制,Microchip Technology的PIC-IoT示例应用程序每秒向云端发送一次传感器数据(CFG_SEND_INTERVAL=1)并更新电路板的LED以指示当前的运行状态。(代码来源:Microchip Technology)
从云处理命令同样容易。示例应用程序演示了如何关联回调例程,例如receivedFromCloud()处理收到的消息。作为初始化阶段的一部分,application_init()前面提到的例程调用CLOUD_subscribe()执行Google Cloud订阅过程的例程()。作为此过程的一部分,软件imqtt_publishReceiveCallBackTable使用回调更新table()receivedFromCloud()(清单3)。在这种情况下,示例应用程序使用config主题并将索引硬编码到表中NUM_TOPICS_SUBSCRIBE=1,但更常见的命令主题和派生子主题是另一种选择。
复制 void CLOUD_subscribe(void) {    mqttSubscribePacket cloudSubscribePacket;    uint8_t topicCount = 0;      // Variable header    cloudSubscribePacket.packetIdentifierLSB = 1;    cloudSubscribePacket.packetIdentifierMSB = 0;      // Payload    for(topicCount = 0; topicCount < NUM_TOPICS_SUBSCRIBE; topicCount++)    {       sprintf(mqttSubscribeTopic, "/devices/%s/config", deviceId);       cloudSubscribePacket.subscribePayload[topicCount].topic = (uint8_t *)mqttSubscribeTopic;       cloudSubscribePacket.subscribePayload[topicCount].topicLength = strlen(mqttSubscribeTopic);       cloudSubscribePacket.subscribePayload[topicCount].requestedQoS = 0;         imqtt_publishReceiveCallBackTable[0].topic = mqttSubscribeTopic;       imqtt_publishReceiveCallBackTable[0].mqttHandlePublishDataCallBack = receivedFromCloud;       MQTT_SetPublishReceptionHandlerTable(imqtt_publishReceiveCallBackTable);    }       if(MQTT_CreateSubscribePacket(&cloudSubscribePacket) == true)    {       debug_printInfo("CLOUD: SUBSCRIBE packet created");       sendSubscribe = false;    } } 
清单3:Microchip Technology示例应用程序显示了开发人员如何轻松地将回调例程与收到的MQTT消息相关联,在这种情况下,将receivedFromCloud()函数定义为来自默认主题的已接收消息的回调。(代码来源:Microchip Technology)
开发人员可以使用交付的PIC-IoT硬件和软件包,立即开始探索从Google Cloud发送和接收数据的不同方案。包括ATECC608A CryptoAuthentication设备在内的PIC-IoT硬件已预先配置为支持Google Cloud IoT Core和此使用模型。开发人员可以轻松使用MPLAB X IDE和MPLAB Code Configurator来修改或构建旨在安全连接到Google Cloud的全新IoT应用程序。

结论

在物联网设备和网络资源之间提供安全连接对于任何网络服务环境都是必不可少的,并且对于使用商业云服务是必需的。构建安全连接所需的软件服务层可能会给物联网项目带来显着的延迟,甚至在资源有限的物联网设计中也是不切实际的。使用包含专用安全IC的Microchip Technology PIC-IoT等开发板,开发人员可以快速开发出能够安全连接到Google Cloud的物联网应用。

用户喜欢...

ADI这些器件让传感器充满“智能”,挑战物联网应用so easy

selina 在 周四, 05/04/2017 - 16:36 提交 谈不完的物联网在人类的日常生活中越来越重要,而随着人类的依赖我们将更多的数据交给云端处理,这样势必会对物联网应用造成“压”迫从而引起更多挑...


如何突破物联网应用挑战?从一个方案平台两个应用案例看端倪

selina 在 周四, 04/27/2017 - 09:45 提交 对于物联网来说,把所有数据都扔给云端处理,许多挑战便会接踵而至:带宽挑战——要把庞杂的原始数据上传到云端会占用不少带宽;处理性能瓶颈——海...