所以,我所追求的是base64 编码的SHA1 HMAC。我找到了Adafruit Cryptosuite叉子,它是Cathedrow库的一个精简的 SHA1 分支。我希望能够使用 base64 编码的 SHA1-HMAC 签名在我的 Arduino 和 Python 应用程序之间聊天。但是,它似乎并没有产生一致的结果:
在 Arduino 上,以下应为字符串“testing”生成 SHA1-HMAC:
signingKey[] = "testKey";
Sha1.initHmac_P((uint8_t *)signingKey, sizeof(signingKey) - 1);
Sha1.print("testing");
我现在想对此进行base64编码,Adafruit的推文示例似乎有一个整洁的功能(我意识到这只需要一个SHA1-HMAC,没有别的):
// base64-encode SHA-1 hash output. This is NOT a general-purpose base64
// encoder! It's stripped down for the fixed-length hash -- always 20
// bytes input, always 27 chars output + '='.
for(in = Sha1.resultHmac(), out=0; ; in += 3) { // octets to sextets
b64[out++] = in[0] >> 2;
b64[out++] = ((in[0] & 0x03) << 4) | (in[1] >> 4);
if(out >= 26) break;
b64[out++] = ((in[1] & 0x0f) << 2) | (in[2] >> 6);
b64[out++] = in[2] & 0x3f;
}
b64[out] = (in[1] & 0x0f) << 2;
// Remap sextets to base64 ASCII chars
for(i=0; i<=out; i++) b64[i] = pgm_read_byte(&b64chars[b64[i]]);
b64[i++] = '=';
b64[i++] = 0;
输出:
qn9vJmo4Q6KhPgbn5nVOSOUCU5Q=
但是,当我从 python 方面看这个时,一切都不是很好:
hm = hmac.new('testKey', 'testing', hashlib.sha1)
print binascii.b2a_base64(hm.digest())[:-1]
输出:
YNQScdQ7h1t5Hi1Uw0vz8Biil2M=
很明显,这两者是不同的。不幸的是,我没有过多地使用 Arduino/C++,并且更熟悉 Python 方面。我正在尝试做的事情是否有明显的错误,或者我使用的库是否不足以达到目的?
谢谢!