news 2026/8/19 11:11:25

树莓派硬件加密实战:ATECC608A构建物联网安全网关

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
树莓派硬件加密实战:ATECC608A构建物联网安全网关

1. 项目概述:当边缘计算遇上硬件级加密

最近在折腾一个物联网数据采集的项目,数据敏感度比较高,客户明确要求从传感器到云端的数据流必须全程加密,而且加密的“根”不能放在软件里,得有个物理上牢靠的“保险箱”。这让我想起了以前在金融行业接触过的HSM(硬件安全模块),但那玩意儿价格和功耗对边缘设备来说简直是“杀鸡用牛刀”。于是,我把目光投向了更亲民的方案:用树莓派作为边缘网关,搭配一个能进行硬件加密的协处理器,比如基于FPGA的加密芯片或者一些集成了加密引擎的微控制器,来实现一个低成本、高安全性的加密数据发送链路。这个项目,我称之为“基于Kryptor(HSM/FPGA)与树莓派的加密数据传输”。

简单来说,它的核心目标就是:在资源受限的树莓派上,借助专用硬件(Kryptor泛指一类硬件加密设备)来执行最消耗资源的非对称加密和密钥管理,树莓派自身则负责数据采集、协议封装和网络通信,从而构建一个软硬结合、安全边界清晰的物联网安全网关。这非常适合那些对数据保密性有要求,但预算和部署环境又比较苛刻的场景,比如工业传感器数据上报、远程设备状态监控、甚至是一些智能家居中的隐私数据收集。

整个方案听起来有点复杂,但拆解开来,无非是几个核心环节的串联:硬件选型与连接、加密引擎的驱动与调用、数据流的封装与发送。接下来,我就把自己从方案设计到代码调试踩过的坑、总结的经验,毫无保留地分享出来。

2. 核心硬件选型与架构设计思路

硬件是项目的基石,选型直接决定了方案的可行性、成本和最终性能。这里的关键是理解树莓派和加密硬件各自的分工。

2.1 树莓派的角色:敏捷的指挥官与通信兵

树莓派在这里绝不充当“加密猛将”,它的核心优势在于丰富的IO接口(GPIO, I2C, SPI, UART)、灵活的网络能力(以太网/Wi-Fi/4G)和强大的软件生态。因此,它的职责非常明确:

  1. 数据采集与预处理:通过GPIO、I2C等接口连接各类传感器(温湿度、压力、图像等),读取原始数据,并进行必要的初步处理,如格式转换、数据滤波。
  2. 协议封装与流管理:将预处理后的数据,按照应用层协议(如MQTT、HTTPS、自定义TCP)的要求进行封装。管理整个数据流的生命周期,包括重试、缓存、顺序保证等。
  3. 硬件协调与驱动:通过特定的总线(最常用的是SPI或I2C)与加密硬件通信,发送待加密的明文数据块,并接收加密后的密文。它负责调用加密硬件提供的API或遵循其通信协议。
  4. 网络通信:最终将封装好的、包含密文的数据包,通过网络接口发送到远端的服务器或云平台。

选择树莓派型号时,主要考虑IO需求、网络需求和计算余量。对于大多数传感器数据采集场景,树莓派3B+或4B的算力已绰绰有余。如果对网络稳定性要求极高,建议使用带有千兆以太网口的树莓派4B,并通过有线网络连接。

2.2 “Kryptor”硬件加密模块的选型:专业的保险柜

“Kryptor”在这里是一个泛指,代表能够提供硬件级加密运算和安全存储的器件。根据成本、性能和安全等级,主要有以下几类选择:

1. 集成加密引擎的微控制器(MCU)例如Microchip的ATECC608A、英飞凌的OPTIGA™ TPM。这类芯片通常通过I2C接口与树莓派通信。

  • 优点:成本极低(通常几美元),功耗极小,体积小巧,专门用于ECC(椭圆曲线加密)运算、SHA-256哈希和密钥安全存储。ATECC608A还预置了用于TLS(物联网常用)的证书槽,开箱即用。
  • 缺点:加密算法固定,通常只支持ECC和AES,性能有限,不适合大数据流的高速加密。
  • 适用场景:适用于物联网设备身份认证、建立安全会话(TLS握手中的密钥协商)、对少量关键指令或配置数据进行签名/加密。

2. 基于FPGA的加密加速卡/模块例如一些基于Xilinx Spartan-6或Intel(Altera)Cyclone系列FPGA开发的核心板。它们可以通过SPI、甚至PCIe(树莓派CM4有PCIe接口)与树莓派连接。

  • 优点:灵活性极高,可以通过硬件描述语言(如VHDL/Verilog)编程实现任意加密算法(AES, RSA, ECC, SHA-3等),并且可以高度并行化,实现极高的吞吐量。密钥可以存储在FPGA内部的保密存储器中。
  • 缺点:开发难度大,需要数字电路和硬件编程知识;成本相对较高;功耗比专用加密芯片大。
  • 适用场景:需要对大量数据(如视频流、批量文件)进行高速、定制化加密处理的场景。

3. 专用加密协处理器例如国产的SM2/SM4算法芯片,或一些提供标准PKCS#11接口的USB加密棒。这类设备通常提供了完整的驱动和中间件。

  • 优点:专业化程度高,通常符合特定的国密或行业标准,提供稳定的驱动和API,易于集成。
  • 缺点:可选型号较少,可能受供应链影响,成本不定。
  • 适用场景:有明确合规性要求(如国密算法)的项目。

我的选型心得:对于绝大多数物联网边缘加密场景,ATECC608A这类芯片是性价比最高的起点。它完美解决了物联网设备最头疼的“身份”和“密钥安全”问题。除非你有海量数据流加密需求,否则不建议初学者直接挑战FPGA方案。本项目后续的实操部分,也将以树莓派 + ATECC608A为例进行展开,因为它的生态最成熟,资料最多,最容易成功复现。

2.3 系统架构设计

确定了硬件,整个系统的数据流架构就清晰了:

[传感器1] --> [树莓派 GPIO/I2C] --> 原始数据 --> [数据预处理] --> 待加密明文 [传感器N] --^ | | [服务器/云端] <-- [网络发送] <-- [协议封装] <-- [加密硬件] <-- [SPI/I2C调用] <-- 待加密明文

树莓派上运行一个主控程序(比如用Python编写),这个程序会:

  1. 轮询或中断方式读取传感器数据。
  2. 将数据整理成块,通过smbus2(I2C)或spidev(SPI)库发送给ATECC608A芯片。
  3. 发送指令要求芯片使用内部某个密钥(永远不出芯片)进行加密或签名。
  4. 芯片返回密文或签名结果。
  5. 主控程序将密文嵌入到MQTT消息的payload中,或者作为HTTPS请求的body,发送至云端。

这样设计的核心安全优势在于:用于加密的私钥永远只存在于加密芯片内部,树莓派的主操作系统即使被攻破,攻击者也无法窃取私钥,只能得到加密后的密文,从而实现了关键安全资产的隔离。

3. 以ATECC608A为例的实战搭建与驱动

我们选择最常见的树莓派4B和Microchip ATECC608A芯片作为实战组合。ATECC608A通常以SOIC-8封装的形式出现在一个小的分线板上,方便与树莓派连接。

3.1 硬件连接与准备

ATECC608A通过I2C接口通信,树莓派上有多个I2C通道,我们使用最常见的I2C-1

连接步骤:

  1. 树莓派引脚:找到树莓派GPIO排针的3号脚(SDA1, GPIO2)和5号脚(SCL1, GPIO3)。
  2. ATECC608A模块:将模块的SDA引脚连接到树莓派的3号脚,SCL引脚连接到5号脚。
  3. 电源:将模块的VCC连接到树莓派的1号脚(3.3V),GND连接到树莓派的任意一个地线脚(如6,9,14,20等)。
  4. 地址选择:ATECC608A的I2C地址由它的引脚决定。如果模块的地址选择引脚(ADDR)接地,地址通常是0x60(写)和0x61(读)。这是最常见配置。如果接VCC,地址则为0xC0/0xC1。请根据你的模块实际情况确定。

树莓派系统配置:在树莓派终端执行以下命令,确保I2C功能已开启。

# 使用raspi-config工具开启I2C sudo raspi-config # 选择 Interface Options -> I5 I2C -> Yes # 重启树莓派 sudo reboot # 重启后,安装i2c工具并检测设备 sudo apt update sudo apt install i2c-tools -y # 检测I2C总线上的设备,-y参数指定I2C-1总线 sudo i2cdetect -y 1

如果连接正确,你应该能看到地址60(或C0)出现在输出表格中。这证明硬件连接和基础驱动没问题。

3.2 软件环境与核心库安装

树莓派上的主控程序我们用Python来写,因为它有丰富的库支持,开发效率高。核心是Microchip官方提供的python-cryptoauthlib库,它是cryptoauthlibC库的Python封装。

# 安装必要的系统依赖 sudo apt install python3-dev python3-pip swig -y # 使用pip安装 cryptoauthlib 及其Python接口 pip3 install cryptoauthlib

安装完成后,你可以尝试运行一个简单的测试脚本来验证库是否能正常找到设备。创建一个test_device.py文件:

import cryptoauthlib # 初始化库 cryptoauthlib.init() # 获取设备列表(通常只有一个) devices = cryptoauthlib.get_device_list() print(f"Found devices: {devices}") if devices: # 获取第一个设备的接口信息 iface = devices[0] print(f"Interface: {iface.iface_type}, Address: {hex(iface.device_address)}") # 尝试创建设备对象并获取信息 cfg = cryptoauthlib.cfg_ateccx08a_i2c_default() cfg.cfg.atcai2c.address = iface.device_address # 设置地址 cfg.cfg.atcai2c.bus = 1 # I2C-1总线 device = cryptoauthlib.ATECCX08A(cfg) info = device.info() print(f"Device Info: {info}") else: print("No ATECC device found!")

运行这个脚本,如果能看到设备信息和芯片版本号,恭喜你,软件环境搭建成功。

3.3 核心操作:密钥配置、加密与签名

ATECC608A出厂时是一个“空白”状态,或者预装了一个测试配置。在实际使用前,你必须根据你的安全策略对其进行个性化配置。这是最关键也最容易出错的一步。

重要警告:配置过程会锁定芯片的某些区域,一旦锁定无法更改。务必先在开发环境、使用可丢弃的芯片进行练习。

1. 配置设备(Provisioning)Microchip提供了cryptoauthlib配套工具ateccerttoolchipconfig,但更直接的方式是使用他们提供的Python脚本示例。核心步骤是:

  • 生成配置结构:定义哪个数据槽(Slot)存放什么密钥(ECC私钥、对称密钥)、用途是什么(签名、加密、密钥协商)、访问权限如何(是否需要加密输入、是否允许输出明文等)。
  • 执行配置命令:通过I2C将配置写入芯片,并执行锁定(Lock)操作。

由于配置过程较为复杂,我强烈建议先从Microchip的GitHub仓库(搜索cryptoauthlib)下载官方示例代码,特别是examples/python目录下的configure.pybasic_operations.py。在运行任何配置脚本前,务必仔细阅读脚本注释,并修改其中的配置参数以符合你的需求

一个简化版的配置思路是:选择一个Slot(例如Slot 0)来存放一个用于签名的ECC P256私钥,并将其配置为“内部签名,私钥永不可读”。

2. 使用内部密钥进行签名(Sign)假设你已经成功在Slot 0配置了一个签名密钥。以下代码展示了如何对一段传感器数据生成ECDSA签名:

import cryptoauthlib from hashlib import sha256 # 初始化并创建设备对象(假设配置已完成) cfg = cryptoauthlib.cfg_ateccx08a_i2c_default() cfg.cfg.atcai2c.bus = 1 cfg.cfg.atcai2c.address = 0x60 device = cryptoauthlib.ATECCX08A(cfg) # 1. 准备待签名的数据(例如:温度25.6℃和时间戳) sensor_data = "temp:25.6,ts:1234567890".encode('utf-8') # 2. 对数据做哈希(ATECC608A通常要求输入的是32字节的SHA-256哈希值) data_hash = sha256(sensor_data).digest() # 3. 使用Slot 0中的私钥进行签名(签名操作在芯片内部完成,私钥不暴露) signature = device.sign(slot=0, message=data_hash, mode=0x80) # mode=0x80表示使用内部私钥 print(f"Data: {sensor_data}") print(f"Signature (R+S): {signature.hex()}") # 4. 通常,你会将原始数据sensor_data和签名signature一起发送到服务器。 # 服务器端使用对应的公钥(需要提前安全地导出并部署在服务器)进行验签。

这个过程的核心安全点在于:device.sign()这个调用,只是将数据的哈希值data_hash发送给芯片,芯片在内部完成所有签名运算,并将结果signature返回。私钥从未离开过芯片的安全边界。

3. 使用内部密钥进行加密(Encrypt)ATECC608A也支持基于ECC的加密(如ECDH密钥协商后生成会话密钥,再用AES加密数据)。但更常见的模式是,使用芯片内部存储的一个对称密钥(AES-128)进行加密。这需要你在配置时,将一个Slot设置为存储对称密钥,并允许“加密”操作。

# 假设Slot 8被配置为存储一个AES-128对称密钥,且允许加密操作 plaintext = "My secret sensor reading: 42".encode('utf-8') # ATECC608A的AES加密通常要求数据是16字节(128位)的倍数,需要填充。 # 这里使用一个简单的示例,实际应用请使用PKCS7等标准填充模式。 block_size = 16 padding_len = block_size - (len(plaintext) % block_size) padded_data = plaintext + bytes([padding_len] * padding_len) # 执行加密。同样,密钥在芯片内部,明文数据传入,密文返回。 ciphertext = device.aes_encrypt(key_id=8, plaintext=padded_data, mode=0x00) # mode参数指定细节 print(f"Ciphertext: {ciphertext.hex()}")

服务器端需要拥有相同的对称密钥(或者能通过安全渠道协商出该密钥)才能解密。对于对称加密,密钥的安全分发是另一个需要仔细设计的环节,通常会在设备出厂前预置,或通过第一次上电时建立的、基于非对称加密的安全会话进行交换。

4. 数据流集成与云端通信实践

硬件加密搞定后,下一步就是让树莓派把加密后的数据安全地送出去。这里我们以最常用的MQTT协议为例,展示如何将加密环节嵌入到数据发布流程中。

4.1 程序架构设计

我们将编写一个Python主循环程序,它包含以下几个线程或异步任务:

  1. 传感器读取线程:定期读取传感器数据。
  2. 加密处理线程/函数:将读取到的数据交给ATECC608A进行签名或加密。
  3. MQTT发布线程:将“原始数据+签名”或“密文”作为payload,发布到指定的MQTT主题。
  4. 看门狗与错误处理:监控各个环节的健康状态。

4.2 代码示例:加密签名与MQTT发布

假设我们使用paho-mqtt库进行通信,并且我们已经有了一个配置好签名密钥的ATECC608A设备对象crypto_device

import json import time import threading from hashlib import sha256 import paho.mqtt.client as mqtt import cryptoauthlib # 假设 sensor_reader 是一个虚拟的传感器读取模块 from your_sensor_module import read_temperature_humidity # MQTT 代理地址和端口 MQTT_BROKER = "your.mqtt.broker.com" MQTT_PORT = 1883 MQTT_TOPIC = "device/12345/sensor/data" # 注意:生产环境强烈建议使用MQTT over TLS (端口8883),并验证服务器证书。 # 初始化加密设备 cfg = cryptoauthlib.cfg_ateccx08a_i2c_default() cfg.cfg.atcai2c.bus = 1 cfg.cfg.atcai2c.address = 0x60 crypto_device = cryptoauthlib.ATECCX08A(cfg) # 初始化MQTT客户端 mqtt_client = mqtt.Client(client_id="raspberry_pi_gateway") # 设置TLS等安全连接选项(此处省略,但至关重要) # mqtt_client.tls_set(...) def on_connect(client, userdata, flags, rc): if rc == 0: print("Connected to MQTT Broker!") else: print(f"Failed to connect, return code {rc}") mqtt_client.on_connect = on_connect def sign_sensor_data(data_dict): """使用ATECC608A对传感器数据字典进行签名""" # 1. 将数据转换为可重复的字符串格式(如JSON) data_str = json.dumps(data_dict, sort_keys=True) # sort_keys确保序列化顺序一致 data_bytes = data_str.encode('utf-8') # 2. 计算SHA-256哈希 data_hash = sha256(data_bytes).digest() # 3. 使用硬件芯片签名(Slot 0) try: signature = crypto_device.sign(slot=0, message=data_hash, mode=0x80) return signature.hex() # 返回十六进制字符串 except Exception as e: print(f"Signing failed: {e}") return None def main_loop(): """主循环:读取->签名->发布""" mqtt_client.connect(MQTT_BROKER, MQTT_PORT, 60) mqtt_client.loop_start() # 启动网络循环线程 while True: # 1. 读取传感器数据 sensor_data = read_temperature_humidity() # 返回例如 {'temp': 25.6, 'hum': 60.2, 'ts': int(time.time())} # 2. 对数据进行数字签名 signature_hex = sign_sensor_data(sensor_data) if signature_hex: # 3. 构造最终发送的消息负载 payload = { "data": sensor_data, "sig": signature_hex, # 可附加设备ID、固件版本等信息 "device_id": "12345" } payload_str = json.dumps(payload) # 4. 发布到MQTT mqtt_info = mqtt_client.publish(MQTT_TOPIC, payload_str, qos=1) # QoS 1确保至少送达一次 if mqtt_info.rc != mqtt.MQTT_ERR_SUCCESS: print(f"MQTT publish failed: {mqtt_info.rc}") else: print("Skipping publish due to signing failure.") # 5. 等待下一个采集周期 time.sleep(30) # 每30秒采集一次 if __name__ == "__main__": try: main_loop() except KeyboardInterrupt: print("Program terminated.") mqtt_client.loop_stop() mqtt_client.disconnect()

在这个例子中,我们发送的是“明文数据+签名”。云端服务器在收到消息后,需要使用预置的、对应此设备Slot 0的公钥,对sensor_data重新计算哈希并验证sig字段的签名。验证通过,才证明数据确实来自拥有合法私钥的设备,且未被篡改。

如果采用加密模式,则payload["data"]字段存放的将是密文(ciphertext的十六进制字符串),服务器端需要用对应的密钥解密后才能得到原始传感器读数。

4.3 通信层安全加固

仅仅应用层数据加密/签名还不够,通信通道本身也需要保护。

  • MQTT over TLS (MQTTS):务必使用端口8883,并在mqtt_client.tls_set()中配置CA证书,启用服务器证书验证。这可以防止中间人攻击。
  • 客户端认证:除了设备级的数据签名,MQTT代理层也可以使用客户端证书(基于ATECC608A生成的证书)或用户名/密码进行认证,实现双重保险。
  • 主题权限控制:在MQTT代理(如EMQX, Mosquitto)上为每个设备设置严格的ACL(访问控制列表),限制其只能发布和订阅特定的主题,避免设备被入侵后干扰其他设备。

5. 开发与部署中的关键问题与排查

在实际操作中,你几乎一定会遇到下面这些问题。我把它们和解决方法整理出来,希望能帮你节省大量时间。

5.1 硬件与连接问题

问题1:i2cdetect检测不到设备(地址60C0不出现)。

  • 检查电源:用万用表测量模块VCC和GND之间的电压,确保是稳定的3.3V。树莓派GPIO的3.3V引脚输出能力有限,如果模块功耗大或线太长,可能导致电压不足。
  • 检查接线:再三确认SDA、SCL、VCC、GND四根线没有接错、虚焊或短路。I2C总线需要上拉电阻,大多数ATECC608A模块已经集成,如果没有,需要在SDA和SCL到3.3V之间接2.2kΩ-10kΩ的上拉电阻。
  • 检查地址:确认模块的I2C地址选择引脚(ADDR)的连接方式,并相应修改代码中的地址(0x600xC0)。
  • 检查I2C总线是否被占用:运行sudo i2cdetect -l查看总线列表,确保你使用的是正确的总线(通常是i2c-1)。

问题2:可以检测到设备,但Python库调用失败,报错“通信失败”或“设备未响应”。

  • 权限问题:运行Python脚本的用户(如pi)需要有访问I2C设备的权限。可以将用户加入i2c组,或者直接使用sudo运行脚本(不推荐长期方案)。
    sudo usermod -a -G i2c pi # 然后注销重新登录
  • 总线速度:ATECC608A默认支持100kHz和400kHz。cryptoauthlib初始化时可能会配置总线速度。如果树莓派I2C总线速度设置过高(比如1MHz),可能导致通信不稳定。可以尝试在/boot/config.txt中强制设置低速:
    dtparam=i2c_arm=on,i2c_arm_baudrate=100000
  • 库版本与设备配置不匹配:如果你之前用其他工具(如ateccerttool)配置过芯片,但配置处于“锁定”过程中的中间状态,可能会导致官方库无法识别。尝试使用ateccerttool--info命令查看芯片状态,或者考虑将芯片恢复出厂设置(如果支持且可接受)。

5.2 配置与密钥管理问题

问题3:配置脚本执行失败,提示“Zone is locked”或“Command not allowed”。

  • 配置顺序不可逆:ATECC608A的配置区和数据区是分开锁定的。通常先配置(Config Zone),锁定;然后根据配置初始化数据区(如生成密钥),再锁定数据区。一旦锁定,对应区域就不可写。请严格按照官方示例脚本的顺序执行。
  • 理解配置字节:配置文件(.json.hex)中的每一个字节都定义了特定功能。在修改配置前,务必使用chipconfig或示例脚本中的read_config功能,先读取当前配置并备份。然后使用Microchip的配置工具(如atecc608_config_json_generator)可视化地修改配置,生成新的配置文件,再写入。切忌盲目修改。

问题4:签名或加密操作返回错误。

  • 检查Slot配置:确认你操作的Slot(如slot=0)在配置中被正确设置为对应的密钥类型和用途。用于签名的Slot必须配置为Sign用途,并且Private位设置为Never。用于AES加密的Slot,其KeyType必须是AES
  • 检查输入数据格式:对于sign命令,大多数模式要求输入是32字节的SHA-256哈希值,而不是原始数据。对于aes_encrypt,输入数据长度必须是16字节的倍数。
  • 访问权限:检查该Slot的ReadKeyEncryptRead等权限位,确保当前操作(如加密)是被允许的。权限配置非常复杂,请参考芯片数据手册的“Key Configuration”章节。

5.3 性能与稳定性优化

问题5:加密操作导致数据发送延迟明显。

  • 性能基准:ATECC608A进行一次ECDSA签名约需50ms,AES-128加密一个块(16字节)更快。对于每秒几次的传感器读数,这完全不是问题。如果延迟显著高于此,可能是I2C通信或软件开销。
  • 优化I2C通信:确保I2C总线没有其他设备干扰。将多次传感器读数打包成一个稍大的数据块进行一次签名,而不是每个读数都签名,可以摊销固定开销。
  • 异步处理:在主程序中,使用threadingasyncio将加密操作放入单独的线程或任务中,避免阻塞数据采集主循环。采集线程将数据放入队列,加密线程从队列取出处理,再交给发送线程。

问题6:长时间运行后程序崩溃或设备无响应。

  • 异常处理与重试:在所有硬件通信操作(sign,encrypt,read)周围添加try...except块。对于可恢复的错误(如I2C总线错误),实现指数退避重试机制。
  • 看门狗:启用树莓派的硬件看门狗或软件看门狗线程,监控主循环是否卡死。如果卡死,自动重启程序。
  • 电源稳定性:边缘环境电源可能不稳定,考虑使用带有稳压电路的电源模块为树莓派和加密模块供电,避免电压毛刺导致芯片状态异常。

5.4 安全增强建议

问题7:如何安全地分发和存储服务器端的公钥或对称密钥?

  • 非对称场景(签名/验签):在设备配置阶段,将设备生成的公钥(可从芯片安全读出)导入到服务器的可信公钥库中,并与设备ID绑定。这是最标准的做法。
  • 对称场景(AES加密):这是一个挑战。理想情况是在设备生产时,注入一个唯一的对称密钥,并同时安全地录入到后端密钥管理系统(KMS)中。或者,利用非对称加密(芯片的ECC密钥)在设备首次联网时,与服务器进行一次安全的密钥协商(ECDH),动态生成一个会话对称密钥。后者更灵活,但实现更复杂。

问题8:如何防止重放攻击?

  • 时间戳/序列号:在签名或加密的数据中,必须包含一个时间戳或递增的序列号。服务器端需要维护每个设备最近收到消息的序号或时间,拒绝旧序号或过时消息的请求。
  • Nonce:在加密操作中,使用随机数(Nonce)与密钥一起参与运算,确保相同的明文每次加密产生不同的密文。

通过以上这些步骤和注意事项,你应该能够搭建起一个稳定、安全的基于硬件加密的树莓派数据发送系统。这个方案的核心价值在于,它将最敏感的安全操作——密钥存储和加密运算——从通用的、易受攻击的操作系统中剥离出来,交给了一个专为安全而设计的硬件堡垒。虽然初期配置有些繁琐,但一旦跑通,它带来的安全提升和合规性保障,对于许多物联网应用来说是至关重要的。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/19 11:11:03

Python里的OS模块,竟藏着与操作系统交互的惊天秘密

中OS模块的常见20种用法总结 前言“OS”是“ ”的缩写, 从名称来看, OS模块所提供的, 是各类程序同操作系统进行交互的接口。运用OS模块, 一方面能够便利地与操作系统交互, 另一方面还可极大提升代码的可移植性。其中的OS模块给出了跟操作系统交互的函数, 操作系统属于此、标准…

作者头像 李华
网站建设 2026/8/19 11:08:11

STM32L在Keil中搭建FreeRTOS项目:从CubeMX生成到手动集成的完整指南

1. 从零到一&#xff1a;为什么要在Keil中为STM32L搭建FreeRTOS项目&#xff1f; 如果你手头有一块STM32L系列的低功耗微控制器&#xff0c;比如STM32L4或者更早的L1、L0系列&#xff0c;并且想用它来做点稍微复杂的事情——比如同时处理传感器数据、响应按键、通过串口发送数据…

作者头像 李华
网站建设 2026/8/19 11:03:06

免费在线工具凭什么接近本地大模型?服务端推理的三个层面全讲透

你把一段 MP3 拖进网页端的人声分离工具&#xff0c;十几秒后输出六条分轨——人声、鼓、贝斯、钢琴、吉他、其他。同样的操作在本地跑 Demucs&#xff0c;RTX 3060 也要跑接近一分钟。更让人困惑的是&#xff0c;网页端是免费的&#xff0c;本地跑还要掏电费。 很多人以为&quo…

作者头像 李华
网站建设 2026/8/19 11:01:41

2026丽水危房鉴定检测怎么选?老旧房危房鉴定靠谱机构 TOP 结构安全检测+ 报告可查 电话汇总

丽水的老旧房屋业主们&#xff0c;面对市面上鳞次栉比的鉴定机构&#xff0c;难免感到眼花缭乱、鱼龙混杂。老旧小区的业主、乡镇自建房的住户、商铺经营者、园区厂房负责人乃至学校医院的管理者&#xff0c;都亟需一份权威可靠的危房安全评估。小编发现&#xff0c;不少无资质…

作者头像 李华