如何安全地将多个设备自动连接到 IoT Central?
How to securely auto connect multiple devices to IoT Central?
我正在尝试将多台设备(200 多台)安全地连接到 Microsoft Azure IoT Central。
我有一个 android 应用程序 运行 api 19,它通过 https 将单个设备连接到 IoT Central。
我正在关注tutorial for SaS group enrollment。
我知道我需要一个连接字符串来连接到 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 工作室 code:
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 密钥保管库中的主密钥的 Azure 函数。 android 应用程序仍需要通过功能证明其唯一身份并请求设备特定身份。这将避免在应用程序中使用通用主密钥。
如果您可以选择利用 Android 上的唯一 ID,例如FID(https://developer.android.com/training/articles/user-data-ids),可用于证明应用程序身份与功能。
其他选项是为每个设备生成密钥对并使用它来创建 CSR,获取设备特定的 X509。它将增加更多的复杂性,并且仍然需要 bootstrap 证明机制。
我正在尝试将多台设备(200 多台)安全地连接到 Microsoft Azure IoT Central。 我有一个 android 应用程序 运行 api 19,它通过 https 将单个设备连接到 IoT Central。
我正在关注tutorial for SaS group enrollment。
我知道我需要一个连接字符串来连接到 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 工作室 code:
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 密钥保管库中的主密钥的 Azure 函数。 android 应用程序仍需要通过功能证明其唯一身份并请求设备特定身份。这将避免在应用程序中使用通用主密钥。
如果您可以选择利用 Android 上的唯一 ID,例如FID(https://developer.android.com/training/articles/user-data-ids),可用于证明应用程序身份与功能。
其他选项是为每个设备生成密钥对并使用它来创建 CSR,获取设备特定的 X509。它将增加更多的复杂性,并且仍然需要 bootstrap 证明机制。