为物联网设备自动生成全球唯一身份的最佳方式

Posted

技术标签:

【中文标题】为物联网设备自动生成全球唯一身份的最佳方式【英文标题】:Best way to auto generate global unique identity for IoT devices 【发布时间】:2021-12-30 00:11:34 【问题描述】:

我有一个用 Golang 为物联网设备开发的应用程序,它通过 MQTT 进行通信,这个应用程序也可以安装在任何支持 Docker 和 Golang 的设备上。

现在,当我第一次在设备上运行我的应用程序时,我想为每台设备的应用程序自动生成唯一标识。 我正在考虑使用永久 MAC 或序列号,这是一种好方法吗?所有设备都会有永久 MAC 或序列号吗?如果不是,那么实现这一目标的更好方法是什么。

【问题讨论】:

这个ID是不是每次重启都必须一样,这样app每次启动都能识别设备? @lewislbr 是的,这就是确切的要求 【参考方案1】:

绝对不能保证您的设备甚至会有一个序列号或 MAC 地址,更不用说一个唯一的了。

关于连续剧,每个设备制造商都各司其职。那些具有软件可访问序列号的设备通常会将它们刻录到需要特殊工具才能读取的某个地方的 EEPROM 中。您需要了解每个目标设备的过程和运行工具。

关于 MAC,如果您的设备有 WiFi 或以太网接口,那么制造商可能已经为其分配了一个全球唯一的 MAC 地址。但是,您可以自行查找相关的网络接口并读取其 MAC 地址。这将相当麻烦,因为您必须发现系统的网络接口,确定它是否是物理接口(与拨号、网桥、*** 等虚拟接口相比)并读取其 MAC。最后,有些设备根本没有任何物理 WiFi 或以太网接口——它们可能带有 GSM 模块或 LoRA 或完全其他的东西。

我建议不要依赖 MAC 或序列号。首次启动时生成您自己的 GUID,将其存储在配置中并用于后续识别。

PS - 我假设您的目标是运行 Linux 或其他桌面操作系统的更大的设备。微控制器通常不支持 Go,当然也不支持 Docker。

【讨论】:

感谢@Tarmo 的详细回答,是的,我的目标是更大的设备,例如 raspberry pi、kunbus 现在的问题是,如果我在第一次安装时选择 GUID 并将其存储在配置中,那么我只会在卸载我的应用程序之前拥有它,但稍后如果我的应用程序从设备上卸载,那么我将不会无法拥有该设备的 GUID 映射,在这种情况下,我需要找到可以永久标识该设备的东西,以便下次在同一设备上安装我的应用程序时,我应该能够使用相同的 ID 【参考方案2】:

尝试从以下代码中获得一些灵感:

package main

import (
    "crypto/sha1"
    "encoding/hex"
    "fmt"
    "time"
)

// SHA1 hashes using sha1 algorithm
func SHA1(text string) string 
    algorithm := sha1.New()
    algorithm.Write([]byte(text))
    return hex.EncodeToString(algorithm.Sum(nil))


func main() 
    var macAddress = "00:00:00:00:00:00"
    var deviceType = "deviceType"
    var deviceName = "deviceName"
    var deviceModel = "deviceModel"
    var deviceManufacturer = "deviceManufacturer"
    var deviceVersion = "deviceVersion"
    var deviceSerialNumber = "deviceSerialNumber"
    var timeInMilliseconds = time.Now().UnixNano() / int64(time.Millisecond)
    // convert time to string
    var timeString = fmt.Sprintf("%d", timeInMilliseconds)
    var conc = macAddress + "-" + deviceType + "-" + deviceName + "-" + deviceModel + "-" + deviceManufacturer + "-" + deviceVersion + "-" + deviceSerialNumber + "-" + timeString

    // calculate the uuid using the sha256 algorithm
    // and the concatenated string
    var uuid = SHA1(conc)
    fmt.Println(uuid)



MAC 地址主要由设备制造商分配,因此通常称为烧录地址,或以太网硬件地址、硬件地址或物理地址。 序列号使公司能够识别产品并获取有关该产品的更多信息以进行更换或查找兼容部件

【讨论】:

【参考方案3】:

阅读一些crypto random data。将随机数据转换为字符串。

  // N is number of bytes of random data to 
  // to read. I set to N, the same number of 
  // bytes in a UUID.
  const N = 16

  p := make([]byte, N)
  if _, err := rand.Read(p); err != nil 
      // TODO: handle error
  
  id := fmt.Sprintf("%x", p)

【讨论】:

以上是关于为物联网设备自动生成全球唯一身份的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

物联网设备模糊:DIANE:识别应用程序中的模糊触发器,为物联网设备生成受限制的输入

物联网智能硬件设备身份验证机制

Arm 生态系统为物联网奠定信任根基

Aruba AIOps | 助力IT部门提供最佳的用户体验和业务价值

存储唯一 URL Slug 的最佳方式是啥?

微软物联网开创”万物互联“新时代