我正在尝试将多个设备(200 多个)安全地连接到 Microsoft Azure IoT Central。 我有一个运行 api 19 的 Android 应用程序,它通过 https 将单个设备连接到 IoT Central。
我正在关注tutorial for SaS group enrollment。
我知道我需要一个连接字符串来连接到 IoT Central,它由底层 IoT Hub 名称、设备主键和设备 ID(可以是设备 imei 或其他可以自动生成的东西)组成。< /p>
但是,为每台设备插入主键需要为 200 多台设备修改应用。
为了自动生成设备主键,可以通过运行以下命令从 SAS-IoT-Devices 组主键派生:az iot central device compute-device-key --primary-key <enrollment group primary key> --device-id <device ID>
或在我的情况下使用带有 code 的 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 多次的情况下安全地生成连接字符串?(将主密钥存储在硬件安全模块中并不是真正的选项)
非常感谢!
答案 0 :(得分:1)
如果没有独特的硬件信任根,您的安全状况将始终相对较弱。
一种选择是在 Azure 服务中生成设备特定的密钥,例如Azure Function 可以使用存储在 Azure Key Vault 中的主密钥。 android 应用程序仍需要使用函数证明其唯一身份并请求设备特定身份。这将避免在应用中使用通用主密钥。
如果您可以选择在 Android 上利用唯一 ID,例如FID (https://developer.android.com/training/articles/user-data-ids),可用于通过函数证明应用身份。
其他选项是为每个设备生成密钥对并使用它来创建 CSR,获取特定于设备的 X509。它会增加更多的复杂性,并且仍然需要引导证明机制。