通过EMQX使用ID²,实现数据安全上云

简介: 本文介绍如何通过EMQX使用IoT设备认证(ID²),进行设备身份认证、数据加密等功能,实现物联网数据安全上云。

1. 概述:

IoT设备身份认证(IoT Device ID,ID²)是物联网设备接入到系统时的设备身份标识和设备认证系统,通过可信计算和密码技术为物联网系统提供设备认证、传输通道加密、业务数据加密等端到端的可信接入能力。

MQTT是一种基于发布/订阅模式的轻量级消息传输协议,专门针对低带宽和不稳定网络环境的物联网应用而设计,可以用极少的代码为联网设备提供实时可靠的消息服务。EMQX 是一款大规模可弹性伸缩的云原生分布式物联网 MQTT Broker,提供了高效可靠海量物联网设备连接,能够高性能实时移动与处理消息和事件流数据。


2 方案说明:

  • 部署EMQX为IoT设备管理平台,在物联网应用中集成ID²云端SDK、在物联网设备(Linux)中通过Paho-MQTT集成ID²设备端SDK,通过身份认证、业务数据加密等功能,实现物联网数据安全上云。
  • 使用此技术方案,具有如下优点:
  • 不涉及对IoT设备管理平台的改造,开发成本低,对物联网平台的影响小。
  • 在物联网设备和物联网应用,进行端到端的数据加密,确保数据传输全链路的安全。
  • 可只针对敏感信息(基于MQTT消息区分)进行数据加密,可保持较高的数据传输和处理性能。


3. 使用流程:

3.1 创建产品:

本章节描述了如何在IoT设备身份认证控制台创建产品并分配授权额度,包括:

  • 创建产品
  • 分配授权额度


前提条件


  1. 登录产品控制台,在左侧导航栏,选择常规>集成与部署 > IoT设备身份认证,单击独立使用(三方物联网平台)卡片的开始接入按钮。

  1. 配置产品页面创建新产品&分配ID²授权,然后单击下一步按钮。
  • 选择产品:请选择创建新产品,并输入产品名称。
  • ID²有效期:免费试用、或者付费授权
  • 分配ID²授权数量:请输入ID²授权数量。



3.2 选择设备认证算法:

IoT设备身份认证支持国际算法(AES-128、AES-192、AES-256)和国密算法(SM1-128、SM2-256、SM4-128),能满足企业不同安全等级的需求。

说明

国密算法SM1需要配合ID²安全芯片使用,SM2用于业务数据完整性校验和加密。


ID²新增产品中默认选择的设备认证算法是AES-128;如需选择其他设备认证算法,请按如下步骤操作:

  1. 查看配置信息页面选择设备认证算法SM4-128,单击提交按钮。

  1. 查看配置信息页面您需要记录下ProductKey、ProductSecret
  • ProductKey:设备所属产品的ProductKey。
  • ProductSecret:由IoT设备身份认证颁发的产品密钥,与 ProductKey 成对出现。
  1. 单击下一步按钮进入集成云端SDK页面。


3.3 集成云端SDK:

3.3.1 阿里云账号的AccessKey:

  • AccessKey是调用阿里云API的身份凭证,请参见获取AccessKey
  • 需要注意的是AccessKey的归属账号必须与创建产品时的账号保持一致。


3.3.2 下载云端SDK:

  1. 执行wget命令获取云端SDK:
wget https://id2-schip-online.oss-cn-shanghai.aliyuncs.com/static_resources/id2_server_sdk/ID2_Server_SDK.tar
  1. 在云端环境执行命令tar -xvf ID2_Server_SDK.tar 完成解压,执行命令cd <解压SDK后的目录>。设备端SDK的目录说明见表格内容:

目录/文件

说明

demos

ID²云端的示例代码

lib

ID²云端的Jar包


3.3.3 集成云端SDK

  1. 添加Maven项目依赖,引入阿里云Java SDK公共包。
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.5.6</version>
</dependency>


  1. 导入云端SDK中的lib/aliyun-java-sdk-id2-1.1.4.jar到项目工程中,初始化云端SDK。
public static String ACCESS_KEY = null;
public static String ACCESS_SECRET = null;
public static String REGION_ID = "cn-shanghai";
public static String END_POINT = "id2." + REGION_ID + ".aliyuncs.com";
// Load ACCESS_KEY and ACCESS_SECRET From Config File
loadConfigProperties("xxx.conf");
IClientProfile profile = DefaultProfile.getProfile(REGION_ID, ACCESS_KEY, ACCESS_SECRET);
DefaultProfile.addEndpoint(REGION_ID, PRODUCT_CODE, END_POINT);
client = new DefaultAcsClient(profile);


  1. 发起调用,ID²云端SDK为每个API封装了一个类,命名为${API名称}+"Request",如VerifyRequest,用于API的调用请求,ID²云端API列表请参考ID²云端API手册
  • ID²空发
OtpGetId2Request request = new OtpGetId2Request();
request.setDeviceAuthCode(authCode);
request.setApiVersion(1.1.2);
OtpGetId2Response response = client.getAcsResponse(request);
  • 获取ID²认证挑战字
GetServerRandomRequest request = new GetServerRandomRequest();
request.setId2(id2Id);
request.setApiVersion(1.1.2);
GetServerRandomResponse response = client.getAcsResponse(request);
System.out.println("GetServerRadom requestId:" + response.getRequestId());
  • ID²设备认证和业务密钥加密
VerifyAndEncryptRequest request = new VerifyAndEncryptRequest();
request.setApiVersion(1.1.2);
request.setProductKey(productKey);
request.setId2(id2Id);
request.setAuthCode(authCode);
request.setData(keyInfo);
VerifyAndEncryptResponse response = client.getAcsResponse(request);
System.out.println("VerifyAndEncrypt requestId:" + response.getRequestId());


  1. 应用集成ID²云端SDK的示例代码,请参考demos/ID2SPDemo


3.4 集成设备端SDK:

3.4.1 下载设备端SDK:

  1. 执行wget命令获取设备端SDK:
wget https://id2-schip-online.oss-cn-shanghai.aliyuncs.com/static_resources/id2_client_sdk/ID2_Client_SDK.tar
  1. 执行命令tar -xvf ID2_Client_SDK.tar完成解压,执行命令cd <解压SDK后的目录>。设备端SDK的目录说明见表格内容:

目录/文件

说明

demos

ID²设备端的示例代码:

  • spdemo:提供独立使用ID²的演示示例

external

用于存放外部的组件:

include

ID²的头文件目录

libs

ID²的静态库

make.rules

编译规则文件,可配置编译工具链和编译参数

make.settings

编译配置文件,可配置ID²的密钥类型(如AES、SM4)

makefile

编译脚本

src

ID²的源码目录

tests

ID²的测试用例,包括HAL和ID²的测试。

tools

ID²的本地工具/脚本:

  • ls_sp_demo.sh:独立使用场景中的设备端演示示例


3.4.2 集成设备端SDK:

  1. 设备硬件及系统层集成,详情请参考ID²设备端SDK适配接口
  • OSA接口适配:实现src/osa/ls_osa.c中的接口。
  • HAL接口适配:实现src/hal/km/demo/ls_hal_km.c中的接口,通过hal_test测试用例验证(成功日志: “HAL KM Test Pass”)


  1. 设备应用层集成,详情请参考ID²设备端API手册
  • 设备应用首先调用ID²的初始化函数,完成设备端SDK的初始化。
{
    int ret;
     ret = id2_client_init();
     if (ret != IROT_SUCCESS) {
        ls_osa_print("id2 client init fail, %d\n", ret);
        return -1;
     }
}
  • 获取ID²设备端的烧录状态:
  • 如ID²已烧录(is_prov == true),退出ID²空发流程
{
    int ret = 0;
    bool is_prov = false;
    ret = id2_client_get_prov_stat(&is_prov);
    if (ret != IROT_SUCCESS) {
        ls_osa_print("id2 client get prov stat fail, %d\n", ret);
        return -1;
    } 
}
  • 生成ID²设备端的空发认证码。
{
    int ret = 0;
    uint8_t auth_code[ID2_MAX_AUTH_CODE_LEN] = {0};
    uint32_t auth_code_len = ID2_MAX_AUTH_CODE_LEN;
    ret = id2_client_get_otp_auth_code(
              (uint8_t *)product_secret, (int)strlen(product_secret),
               auth_code, &auth_code_len);
    if (ret != IROT_SUCCESS) {
        ls_osa_print("id2_client_get_otp_auth_code fail, %d\n", ret);
        return -1;
    }
}
  • ID²空发的网络请求和响应。
  • authCode:ID²空发认证码的Base64编码
  • otpData:ID²云端下发的空发数据(Base64格式)
# ID²空发请求:
{commandId:xxx, authCode: xxx}
# ID2空发响应:
{commandId:xxx, otpData: xxx}
  • 存储ID²密钥到设备安全存储区。
{
    int ret = 0;
    ret = id2_client_load_otp_data(otp_data, otp_len);
    if (ret != IROT_SUCCESS) {
        ls_osa_print("id2 load otp data fail, %d\n", ret);
        return -1;
    }
}
  • 获取设备端的ID² ID。
{
    int ret = 0;
    uint8_t id2_id[ID2_ID_MAX_LEN + 1] = {0};
    uint32_t id2_id_len = ID2_ID_MAX_LEN;
    ret = id2_client_get_id(id2_id, &id2_id_len);
    if (ret != IROT_SUCCESS) {
        ls_osa_print("id2 client get id fail, %d\n", ret);
        return -1;
    }
}
  • ID²认证挑战字的网络请求和响应。
# ID²认证挑战字的请求:
{commandId:xxx, Id2Id: xxx}
# ID2认证挑战字的响应:
{commandId:xxx, challenge: xxx}
  • 获取设备端的ID²认证码。
{
    int ret = 0;
    uint8_t auth_code[ID2_MAX_AUTH_CODE_LEN] = {0};
    uint32_t auth_code_len = ID2_MAX_AUTH_CODE_LEN;
    ret = id2_client_get_challenge_auth_code(
              challenge, NULL, 0, auth_code, &auth_code_len);
    if (ret != IROT_SUCCESS) {
        ls_osa_print("id2 client get challenge auth code fail, %d\n", ret);
        return -1;
    }
}
  • 设备端认证和数据加密的网络请求和响应。
  • cipherData:ID²云端下发的加密数据
# ID²设备认证和数据加密的请求:
{commandId:xxx, productKey:xxx, Id2Id:xxx, authCode:xxx}
# ID2设备认证和数据加密的响应:
{commandId:xxx, cipherData: xxx}
  • 解密ID²云端加密下发的数据。
{
    int ret = 0;
    ret = id2_client_decrypt(cipher_data, cipher_len, cipher_data, &cipher_len);
    if (ret != IROT_SUCCESS) {
        ls_osa_print("id2 client decrypt fail\n");
        return -1;
    }
}
  • 应用集成ID²设备SDK的示例代码,请参考demos/spdemo

  1. 设备端SDK的编译:
  • ID² SDK的根目录,执行命令vi ./make.settings打开文件, 修改CONFIG_LS_ID2_KEY_TYPE的值
  • 同ID²产品选择的认证算法保持相同

  • 执行命令“make clean & make plat=xxx”进行编译
  • Linux x86_64默认使用系统中的GCC作为编译工具,且默认指定“plat=x86_64”参数
  • 如要编译其他架构,如armhf,在make.rules中配置编译工具,运行编译命令“make clean & make plat=armhf”


3.5 业务数据加密:

在完成设备端集成的基础上,运行设备应用,  或者使用演示示例,进行ID²认证和加密,以及业务数据加密的调试。


  1. 使用演示示例:
  • 部署EMQX物联网平台,详情参见EMQX安装和部署
  • 本节描述在Ubuntu 22.04上通过Docker部署EMQX物联网平台的示例
  • 安装和启动Docker工具:
# Install Docker
curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun
# Start Docker
sudo systemctl enable docker
sudo systemctl start docker
# Get Docker Version
docker -v
  • 使用Docker安装EMQX物联网平台:
# Get emqx-5.1.3 docker image
docker pull emqx/emqx:5.1.3
# Start docker emqx instance
docker run -d --name emqx -p 1883:1883 emqx/emqx:5.1.3
# Get docker instance info
docker ps
  • 部署云端演示示例,在ID²云端SDK根目录,配置vi demos/ID2SPMessage/Id2SpDemo.conf文件中的AccessKey和AccessSecret信息。

  • 执行命令cd demos/ID2SPMessage,执行命令java -jar Id2SpDemo.jar启动云端演示示例。

  • 在ID²设备端SDK目录,执行命令vi tools/ls_sp_demo.sh填写如下参数:
  • HostAddr:云端演示示例的IP地址,localhost代表本机网络。
  • ProductKey:ID²产品的ProductKey。
  • ProductSecret:ID²产品的ProductSecret。
  • PublishData:设备端应用上报的业务数据,建议不超过1024字节。

  • 执行命令./tools/ls_sp_demo.sh运行设备端演示示例,查看设备端打印的日志。
  • 在设备端日志中,可以看到完成ID²的设备认证,以及通过ID²加密下发SP Key Info;设备端通过ID²设备端接口解密后,获得明文的Key ID和Data
  • 在设备端日志中,可看到由SPKey加密下发的业务数据(“SP Server Subscribed Cipher Data”);通过在调用SPKey解密后,可得到明文的下行业务数据(“SP_Server_Hello”)

  • 在云端查看打印的日志。
  • 可看到由SPKey加密的业务数据("Device Published Cipher Data")
  • 使用SPKey解密后,可得到正确的上行业务数据(“SP_Client_Hello”)

  1. 查看设备状态:
  • 登录产品控制台,在左侧导航栏,选择资产>设备,查看设备状态为正常,安全状态为安全。



4. 延申阅读:

相关文章
|
算法 安全 物联网
使用Paho-MQTT集成ID²,实现数据安全上云
IoT设备身份认证(IoT Device ID,ID²)是物联网设备接入到系统时的设备身份标识和设备认证系统,通过可信计算和密码技术为物联网系统提供设备认证、传输通道加密、业务数据加密等端到端的可信接入能力。 MQTT是一种基于发布/订阅模式的轻量级消息传输协议,专门针对低带宽和不稳定网络环境的物联网应用而设计,可以用极少的代码为联网设备提供实时可靠的消息服务。Eclipse Paho提供许多不同版本的MQTT Client以供不同平台使用,其中Paho Embedded-C是为嵌入式平台提供的MQTT开源实现。
|
7月前
|
存储 数据采集 安全
瓴羊Dataphin数据安全能力再升级,内置分类分级模板、上线隐私计算模块
瓴羊Dataphin数据安全能力再升级,内置分类分级模板、上线隐私计算模块
211 0
|
5月前
|
安全 Java Apache
Java中的数据安全与隐私保护技术
Java中的数据安全与隐私保护技术
|
7月前
|
存储 人工智能 算法
数据安全与隐私保护在人工智能时代的挑战与应对
随着人工智能技术的快速发展,数据安全和隐私保护问题日益凸显。本文将探讨在人工智能时代下,数据安全面临的挑战以及如何有效应对,为保护用户数据和维护信息安全提供新思路。
1146 13
|
7月前
|
监控 安全 网络安全
云端防御策略:在云计算中确保数据安全与隐私
【4月更文挑战第6天】 随着企业和个人日益依赖云服务,数据安全性和隐私保护成为不容忽视的挑战。本文探讨了云计算环境中面临的主要网络安全威胁,并提出了综合性的安全措施来加强防护。我们将从云服务的基础知识出发,分析安全风险,并深入讨论如何通过加密技术、身份验证、访问控制以及持续监控等手段来提高数据的安全性。文章的目标是为读者提供一套实用的策略框架,以便在享受云计算带来的便利时,能够有效地保障信息安全。
|
7月前
|
存储 边缘计算 安全
边缘计算中的数据安全与隐私保护:挑战与应对策略
边缘计算中的数据安全与隐私保护:挑战与应对策略
|
7月前
|
存储 安全 数据安全/隐私保护
云计算中的数据安全与隐私保护:技术与挑战
云计算中的数据安全与隐私保护:技术与挑战
844 0
|
7月前
|
数据采集 人工智能 安全
加码数据安全,瓴羊隐私计算能力获多奖项认可!
加码数据安全,瓴羊隐私计算能力获多奖项认可!
|
运维 算法 安全
带你读《构建企业级好数据(Dataphin智能数据建设与治理白皮书)》——4. 特色研发能力
带你读《构建企业级好数据(Dataphin智能数据建设与治理白皮书)》——4. 特色研发能力
364 1
|
存储 数据采集 供应链
带你读《构建企业级好数据(Dataphin智能数据建设与治理白皮书)》——卷首语
带你读《构建企业级好数据(Dataphin智能数据建设与治理白皮书)》——卷首语
277 0