c语言实现digest鉴权,MQTTS,MQ,以及api的安全鉴权---用C语言算token的源代码。啦啦......

昨天晚上排查一晚上,最开始怀疑key密钥base64解密错误,我就用py解密了一边,直接把解密后的16进制数据拷进去替换计算结果,最后的结果和没替换之前是一样的,base64加密和解密应该没问题。最后的怀疑对象是hmac_sha1函数,我也从网上找了好几个版本的开源文件,替换进去,结果还是错的,我从这下载的库文件肯定是对,我不知道具体是哪一方面我没有处理,导致经过hmac_sha1计算后的结果不正确。我C语言功底比较差,没有特意系统的去学过,最后实在找不到问题了

char OTA_Authorization(char *ver, char *res, char *name,unsigned int et, char *access_key, char *authorization_buf, unsigned short authorization_buf_len)

{

size_t olen = 0;

char sign_buf[60];                                                        //保存签名的Base64编码结果 和 URL编码结果

char hmac_sha1_buf[40];                                                //保存签名

char access_key_base64[33] = {0xE6,0x68,0x42,0x3B,0x39,

0x9F,0x3E,0x50,0x20,0xFA,

0x09,0xE2,0xA8,0x41,0xC6,

0xCD,0xD7,0xD3,0x7E,0xC1,

0x6D,0x37,0x71,0x7C,0xE5,

0x69,0xA8,0x2E,0x04,0xAA,

0xCC,0x24};                                        //保存access_key的Base64编码结合,这是py解密后的数据

char string_for_signature[60];                                //保存string_for_signature,这个是加密的key

char restemp[50];                                //保存string_for_signature,这个是加密的key

//----------------------------------------------------将access_key进行Base64**----------------------------------------------------

int df;

//memset(access_key_base64, 0, sizeof(access_key_base64));

//base64_decode(access_key, strlen(access_key),access_key_base64,&df );

access_key_base64[32] = '\0';

printf(access_key_base64);

printf("\n");

//----------------------------------------------------计算string_for_signature-----------------------------------------------------

memset(string_for_signature, 0, sizeof(string_for_signature));

snprintf(restemp, sizeof(restemp),"products/%s/devices/%s", res, name);//这是按照官网的格式加的,

snprintf(string_for_signature, sizeof(string_for_signature), "%d\n%s\n%s\n%s", et, METHOD,restemp, ver);

printf(string_for_signature);

printf("\n");

//前面没问题,前面这一部分打印出来看了结果是正确的

//----------------------------------------------------加密-------------------------------------------------------------------------

memset(hmac_sha1_buf, 0, sizeof(hmac_sha1_buf));

hmac_sha1((unsigned char *)access_key_base64, strlen(access_key_base64),

(unsigned char *)string_for_signature, strlen(string_for_signature),

(unsigned char *)hmac_sha1_buf);

//----------------------------------------------------将加密结果进行Base64编码------------------------------------------------------

olen = 0;

memset(sign_buf, 0, sizeof(sign_buf));

base64_encode(hmac_sha1_buf, strlen(hmac_sha1_buf),sign_buf, &df);

//后面没问题,只有中间sign_buf计算结果不对

//----------------------------------------------------将Base64编码结果进行URL编码---------------------------------------------------

OTA_UrlEncode(sign_buf);

OTA_UrlEncode(restemp);//这是按照官网的格式加的,

//----------------------------------------------------计算Token--------------------------------------------------------------------

snprintf(authorization_buf, authorization_buf_len, "version=%s&res=%s&et=%d&method=%s&sign=%s", ver, restemp, et, METHOD, sign_buf);

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值