azure - 如何安全地自动将多个设备连接到 IoT Central?
问题描述
我正在尝试将多个设备(200 多个)安全地连接到 Microsoft Azure IoT Central。我有一个运行 api 19 的 android 应用程序,它通过 https 将单个设备连接到 IoT Central。
我正在关注SaS 组注册教程。
我知道我需要一个连接字符串来连接到 IoT Central,它由底层 IoT 中心名称、设备主键和设备 ID(可以是设备 imei 或可以自动生成的东西)组成。
但是,为每个设备插入主键需要为 200 多个设备修改应用程序。
为了自动生成设备主键,可以通过运行从 SAS-IoT-Devices 组主密钥派生:或者在我的情况下使用带有代码az iot central device compute-device-key --primary-key <enrollment group primary key> --device-id <device ID>
的 android studio :
public static byte[] ComputeDerivedSymmetricKey(String masterKey, String registrationId) throws InvalidKeyException, NoSuchAlgorithmException
{
byte[] masterKeyBytes = com.microsoft.azure.sdk.iot.deps.util.Base64.decodeBase64Local(masterKey.getBytes(StandardCharsets.UTF_8));
SecretKeySpec secretKey = new SecretKeySpec(masterKeyBytes, HMAC_SHA256);
Mac hMacSha256 = Mac.getInstance(HMAC_SHA256);
hMacSha256.init(secretKey);
return com.microsoft.azure.sdk.iot.deps.util.Base64.encodeBase64Local(hMacSha256.doFinal(registrationId.getBytes()));
}
但这会将主密钥暴露给所有可能导致严重数据泄露的设备。
我想知道如何在不修改应用程序 200 多次的情况下安全地生成连接字符串?(将主密钥存储在硬件安全模块中并不是真正的选择)
非常感谢!
解决方案
在没有唯一的硬件信任根的情况下,您的安全态势总是相对较弱。
一种选择是在 Azure 服务中生成设备特定密钥,例如 Azure Function,它可以使用存储在 Azure Key Vault 中的主密钥。android 应用程序仍需要使用函数证明其唯一身份并请求设备特定身份。这将避免在应用程序中使用通用主密钥。
如果您可以选择利用 Android 上的唯一 ID,例如 FID ( https://developer.android.com/training/articles/user-data-ids ),它可用于通过该功能证明应用程序身份.
其他选项是为每个设备生成密钥对并使用它来创建 CSR,获取设备特定的 X509。它将增加更多复杂性,并且仍然需要引导证明机制。
推荐阅读
- docker - Worldserver 在 docker-compose down 和 docker-compose up 之后更改端口
- php - 如何管理 Canvas 元素以使用 mPDF 生成 PDF
- python - Python 上的代理服务器
- angular - typescript TS2532:对象可能在双向绑定角度中“未定义”
- ios - iOS - 设置 WiFi 配置不适用于 WAC2 设备
- acumatica - 默认 PX RichTextEdit 为纯文本
- excel - 将excel公式if/or语句添加到vba代码
- shader - 丢弃 ps_2_0 中的像素?
- nlp - 动词的子分类框架
- algorithm - 如何根据列表中的路径索引知道关卡的最后一个孩子