安全认证

  • 小度音箱对蓝牙Mesh设备的认证,使用Static OOB方案,以三元组方案实现。
  • 三元组
    • 包含内容:三元组包含三个字段,分别是ProductId、Mac、Secret,一机一密。
    • 如何申请:设备出厂前需要申请三元组,需要烧录在模组中。后续设备入网和音箱交互时,三元组会作为key用于计算认证信息,认证完成后才可以加入音箱网络,被音箱控制。开发者可以免费申请20个调试三元组,在对接完成后申请较多的三元组时需要和小度商务沟通购买。
    • 如何使用:蓝牙Mesh外设的ProductID和MAC地址通过广播Device UUID传输给小度音箱,最后给到小度云端;小度云端会查询到Secret,经过计算得到AuthValue下发给音箱,音箱作为Provisioner和外设根据同样计算方法算出的AuthValue完成双向认证。
    • AuthValue计算方法:将ProductID,MAC,Secret三元组通过英文逗号连接,然后取SHA256(ProductID,MAC,Secret) 计算结果的前16字节,这里用于计算SHA256的英文字母全部为小写。计算过程示例如下:
字段名
计算的值
说明
ProductID "006adb79" 十进制值7003001,对应的十六进制值是0x6adb79
MAC地址 "d4607512797d" "D4:60:75:12:79:7D"
Secret "4922eb7a0a45818da4347cd4ed1b4cf9" 百度提供
连接后的串 "006adb79,d4607512797d,4922eb7a0a45818da4347cd4ed1b4cf9" 按照逗号,英文字母保持小写
SHA256的结果 "b8a39cc092ef95b4bd8c07dd270af03828ec45337e39a32f45cbe8b76c69ed13" 对连接的串按照SHA256计算求值
AuthValue "b8a39cc092ef95b4bd8c07dd270af03" 取SHA256结果的前32位

第三方三元组接入方案

  • 整个流程可以概括为:硬件设备烧录第三方厂商提供的三元组,小度音箱扫描到设备UUID, 解析出MAC地址和CID等信息,查询CID对应厂商的接口,获取到MAC地址对应的三元组用于后续的认证,最终完成设备入网。
  • 过程:
    • 灯泡出厂前烧录厂商三元组<ProductID, MAC, Secret>
    • 用户拿到灯泡, 开箱并接通电源, 灯泡默认处于待配网状态
    • 用户对音箱说『连接灯泡』, 音箱开始扫描设备, 扫描到灯泡, 获取到灯泡UUID, 从UUID中解析出CID, ProductID, MAC地址等信息
    • 如果CID是特定厂商的, 通过mac地址, 调用厂商接口, 获取到三元组信息以及设备类型等信息
    • 从接口获取到设备类型, 比如吸顶灯, 询问用户是否给吸顶灯配网, 在用户确认后, 用三元组算出AuthValue下发给音箱端, 完成后续的配网过程
  • 接口:
    • CID对应的厂商接口地址URL, 要求接口必须是https服务, 厂商在对接前需要和百度约定
    • 请求方式: POST
    • 表头: Content-Type:application/json
    • 参数:
字段名 必选 类型 说明
appId string 第三方厂商给百度分配的appId, 默认值是"BAIDU"
data string 百度请求的json数据转字符串, 使用百度自己的私钥加密并base64_encode处理后, 生成的字符。json数据格式参照下表『接口请求的加密字段列表』。
- 返回:
字段名 必选 类型 说明
status int 状态码, 成功则返回0
msg string 错误信息, 默认为空, 有错误时准确填报相应错误
data string 第三方返回的json数据转字符串, 使用第三方自己的私钥加密并base64_encode处理后, 生成的字符串。json数据格式参照下表『接口返回的加密字段列表』。

接口请求的加密字段列表

字段名 必选 类型 说明
mac string 设备MAC地址

接口返回的加密字段列表

字段名 必选 类型 说明
productId string 产品ProductID
secret string 厂商按照某种算法, 类似于MD5或者SHA256算法, 生成32位字符串secret
deviceType string 设备类型, 比如球泡灯, 彩灯, 吸顶灯, 窗帘, 插座等
friendlyName string 设备名,配网成功后显示的名称
friendlyDescription string 设备描述,配网成功后设备列表中,显示的设备简介
actions array 设备支持的操作, 比如turnOn, turnOff, setBrightnessPercentage, setColorTemperature, setMode等,详细列表参考发现设备文档中的『设备操作类型』
modelName string 设备型号名称
version string 供应商提供的设备版本
  • 接口认证方案:
    • 采用非对称加密方式, 双方均可认证对方身份
    • 百度云平台拥有自己的私钥和公钥, 第三方平台也拥有自己的公钥和私钥
      • 生成公钥和私钥的方式:
        • $ openssl genrsa -out rsa_private_key.pem 1024
        • $ openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem
        • $ openssl rsa -in rsa_private_key.pem -pubout -out public_key.pem
        • 执行完成后, private_key.pem和public_key.pem就是一对有效的私钥和公钥
    • 百度云平台和第三方平台互换自己的公钥并存储在自己的云中
    • 过程:
      • 百度请求第三方接口地址, 请求数据appId='BAIDU', data是设备MAC地址经过百度自己的私钥RSA加密, 并使用base64_encode后生成的字符串
      • 第三方接口收到请求后, 首先用base64_decode处理得到数据data, 通过appId来寻找对应的平台的公钥, RSA解密获得MAC地址, 查询MAC的相关信息, 生成json字符串(确保请求来自百度)
      • 第三方将json字符串通过第三方自己的私钥RSA加密, 并使用base64_encode编码生成字符串data; status=0, msg="", 有异常时status和msg可以置为其他值
      • 百度收到数据后, 用base64_decode处理得到数据data, 然后用对方的公钥RSA解密获得json数据(确保数据来自第三方云平台)