将字符串转换为Char *并使用SHA-256进行哈希处理

时间:2019-05-04 23:11:41

标签: arduino sha256 esp32 arduino-c++

我正在尝试将当前DateTime连接到我的设备Mac地址,格式如下:aa:bb:cc:dd:ee:ffYYmmDDhhMMss,以便我可以对其进行哈希处理,并在每次收集新数据时将其发送到Web服务(所以我必须在每个循环中对其进行哈希处理)

我设法将两个值(mac地址+日期时间)串联起来,并将其转换为char数组

addressDateTime.toCharArray(thisThing, 28);

但是,我对如何继续感到迷茫。

我还尝试以此周期读取结果char*,但我不明白为什么它不起作用:

void loop() {
  while (!timeClient.update()) {
    timeClient.forceUpdate();
  }
  String addressDateTime = getPayload(); //this gets the *aa:bb:cc:dd:ee:ffYYmmDDhhMMss* string
  char* hashThis;
  addressDateTime.toCharArray(hashThis, 28);

  for (int i = 0; i < sizeof(hashThis); i++) {
    char str[3];
    sprintf(str, "%02x", hashThis[i]);
    Serial.print(str);
  }
  delay(5000);
}

我可以正确地将String转换为char*吗?

我应该如何去哈希char*

或者我可以不将字符串转换为char*而散列吗?

更新:

我的代码看起来像这样的atm

  while (!timeClient.update()) {
    timeClient.forceUpdate();
  }
  String addressDateTime = getPayload();
  char hashThis[30];
  addressDateTime.toCharArray(hashThis, 30);

  for (int i = 0; i < sizeof(hashThis); i++) {
    Serial.printf("%02x", hashThis[i]);
  }
  delay(5000);
}

因此我设法将String转换为Char*,除了输出看起来像这样33433a37313a42463a31443a34323a463431393035303531343038323700而不是aa:bb:cc:dd:ee:ff190505141037

弄清楚为什么我的char*数组输出为什么仍然需要对其进行哈希处理。

感谢您帮助我走了这么远,我还有路要走

1 个答案:

答案 0 :(得分:1)

您没有分配空间来存储从addressDateTime获取的C字符串。

hashThischar*,它是指向字符的指针。它尚未设置为任何东西,因此只是...随机。几乎可以肯定,这会使您的程序崩溃或至少行为不当。

给出您的代码,最快的解决方法就是更改

    char* hashThis;

    char hasThis[30];
    addressDateTime.toCharArray(hashThis, 30);

我将28更改为30,因为aa:bb:cc:dd:ee:ffYYmmDDhhMMss实际上是29个字符长,并且C字符串空终止符也需要一个额外的字节。我不确定toCharArray()方法是否设置了空终止符;如果没有,则需要添加

    hasThis[29] = '\0';

您可以通过仅使用String c_str()方法来避免这种情况,该方法将char*返回到String用于保存字符串的内部缓冲区。

在这种情况下,您可以重写

    char* hashThis;
    addressDateTime.toCharArray(hashThis, 28);

    char* hashThis = addressDateTime.c_str();

顺便说一句,你也可以做

    Serial.printf("%02x", hashThis[i]);

,省去snprintf()。不过,在此获得正确的缓冲区大小也很荣幸!

更新

在更新的问题中,您说过希望看到的输出如下:

aa:bb:cc:dd:ee:ff190505141037

代替:

33433a37313a42463a31443a34323a463431393035303531343038323700

您的代码是

for (int i = 0; i < sizeof(hashThis); i++) {
  Serial.printf("%02x", hashThis[i]);
}

您将每个字符写为两位数的十六进制数字,因此您将看到代表该字符的十六进制数字,而不是字符本身。如果要查看字符,请执行以下操作:

for (int i = 0; i < strlen(hashThis); i++) {
  Serial.printf("%c", hashThis[i]);
}

或(更好)

for (int i = 0; i < strlen(hashThis); i++) {
  Serial.print(hashThis[i]);
}

或(最佳)

Serial.println(hashThis);

请注意,我已将您的sizeof更改为strlen。如果出于某种原因在hashThis中放入了较短的字符串,则strlen将做正确的事情,而sizeof将始终返回声明hashThis的长度,而不是长度其中的字符串。