Azure IoT Hub SAS 密钥通过连接字符串手动生成,通过 Forge js lib 进行 HMAC 加密

Azure IoT Hub SAS Key Manual Generation via Connection string with HMAC encryption via Forge js lib

使用伪造的 javascript 库通过 javascript (typescript) 文件中的连接字符串手动生成 SAS 密钥,在测试通过 azure-iot-hub 中的 401 时遇到问题。

连接字符串如下:HostName={resourceUri};SharedAccessKeyName={policyName};SharedAccessKey={key}"

我把字符串打成字典,自己计算过期时间(加3600秒),接着用下面的函数计算SAS key url params:

// MSDN recommendation   
const encodeUriComponentStrict = (str) => {
      return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {
        return '%' + c.charCodeAt(0).toString(16);
      });
    }

function hmacHash(password, signingString) {
  const hmac = forge.hmac.create();
  console.log(`password`, password);
  hmac.start('sha256', forge.util.encode64(password));
  hmac.update(signingString);
  const digested = hmac.digest();
  return forge.util.encode64(digested.data);
}

/**
 * Creates a Sas key for an azure iot registry
 * @param hostName the azure iot resource uri
 * @param policy the shared access key name
 * @param key the shared access key
 * @param expiry int64 representation of expiration time
 */
const createSasKeyForRegistry = (hostName: string, policy: string,
    key: string, expiry: number) => {
    let sas : any = {
        _key: key,
        sr: hostName,
        se: expiry,
        skn: encodeUriComponentStrict(policy),
    };
  sas.sig = encodeUriComponentStrict(hmacHash(sas._key, stringToSign(sas.sr, sas.se)));

  return sas;
}

这是一个示例资源 PUT 我可以在控制台中看到的 IoT 设备端点: https://{my-resource-uri}.net/devices/807417987db61b41ZX1F239P3Q?api-version=2016-11-14

我可以看到 Authorization header 以通常的 SAS 密钥格式附加:

"SharedAccessSignature sr={resource-uri}&sig=koNqIJF56tzzBpqWYp4tRvxeWIJEHSLugA2O2weELZ4%3D&se=1492307707&skn=iothubowner".

尽管如此,我仍然收到 401...已经尝试了几个小时,现在尝试了各种方法都没有成功。请问是不是跟hmac加密功能有关系?那里有可以验证代码的伪造人员吗?对于那些感兴趣的人,我在 ionic 2 应用程序中(基于 angular 2)并使用 angular 2 的 http class 来执行请求。

谢谢。

由于我现在还没有达到 50 声望,所以我不能post将此作为评论。

您是否使用 base64 解码了 SharedAccessKey?

我不熟悉 Forge,但这是我对 CryptoJS 所做的

https://github.com/azure-iothub/device-management/blob/master/main.js#L117

connectionInfo 使用 getInfoFromConnectionString 方法从连接字符串中获取

https://github.com/azure-iothub/device-management/blob/master/main.js#L74

希望对您有所帮助。