设备的激活码最佳实践

时间:2013-08-26 13:40:35

标签: provisioning xively

引用文档:

  

预先注册后,设备可以通过向Xively API发送激活码来激活。这向Xively发出信号,表明设备第一次被唤醒,并且正在请求配置它可以使用的Feed ID和API Key。设备的激活码是使用HMAC-SHA1哈希生成的,该哈希将设备的序列号与其父产品的产品密钥组合在一起,使得某人无法从激活码中提取产品密钥,或者在配置中欺骗性地冒充设备过程

什么是最佳做法:

  1. 在每个设备内存上保留激活码:在工厂编程非常耗时
  2. 通过HMAC-SHA1(serialnumber, productid)计算设备唤醒时的激活码。
  3. 在我的情况下,第二个更有意义,但我无法找到如何从API文档计算HMAC。它只是一个字符串串联?填充怎么样?

2 个答案:

答案 0 :(得分:1)

an example如何在Python中完成此操作。您会注意到它使用binascii .a2b_hex()将产品密钥转换为二进制文件。

以下是Ruby的另一个例子:

require('openssl')

secret = '488f40ff3d0b2c6188e272f8d86416b73b3cb4ef'
serial = '0123456789'

digest = OpenSSL::Digest::Digest.new('sha1')
puts OpenSSL::HMAC.hexdigest(digest, [secret].pack("H*"), serial)

这是Arduino的一个:

// First, download the library from https://github.com/Cathedrow/Cryptosuite
// and make sure it is installed properly, although until it supports Arduino 1.0,
// it's better to use this fork: https://github.com/jkiv/Cryptosuite
#include "sha1.h"

uint8_t secret[]={
  0x48,0x8f,0x40,0xff,0x3d,0x0b,0x2c,0x61,0x88,0xe2,
  0x72,0xf8,0xd8,0x64,0x16,0xb7,0x3b,0x3c,0xb4,0xef,
};
String serial = "0123456789";
String activation_code;

String convertHash(uint8_t* hash) {
  String returnString;
  int i;
  for (i=0; i<20; i++) {
    returnString += ("0123456789abcdef"[hash[i]>>4]);
    returnString += ("0123456789abcdef"[hash[i]&0xf]);  
  }  
  return returnString;
}

void setup() {
  // Generally you would compute the hash once on start up and store it in flash
  // to avoid doing it each time as it can be a bit slow
  Serial.begin(57600);
  Serial.println("computing hmac sha: ");
  Sha1.initHmac(secret, 20);
  Sha1.print(serial); 
  activation_code = convertHash(Sha1.resultHmac());
  Serial.println(activation_code);
}

答案 1 :(得分:1)

所有错误开发人员说的绝对正确。

要记住的另一件事是产品(或设备)页面上列出的产品密钥已经是十六进制对格式。您不需要将字符串转换为十六进制,而是将当前字符串用作十六进制字符串。您可以在errordeveloper发布的Arduino代码中看到这是如何完成的。