linux下,C语言实现,使用系统给予的secret进行HmacSHA1加密求值(28位密钥)

前序:
为了求得后台提交数据所需的sign值,真的研究了几天的时间。首先求得HmacSHA1的值,值是原始的二进制流数据,接着使用base64编码,base64编码所得值是自带换行符的,需处理,最后把数据再进行URLEncode。这才得出完整的sign值,简直要崩溃了。。。。。

在线计算HMAC
https://1024tools.com/hmac

1.使用openssl工具库求HmacSHA1
openssl下载地址:https://www.openssl.org/source/
我用了是最新的版本

2.项目引用openssl,接着调用HMAC函数求值
//例子,伪代码
char dataSign[128] = {0};
sprintf(dataSign, “%s%s”, “appId=”, temp_AppId);
sprintf(dataSign, “%s%s%d”,dataSign, “CardID=”,nUserID);
sprintf(dataSign, “%s%s”,dataSign, “CodeVersion=1”);//CUSTEOM_SOFTVERSION
sprintf(dataSign, “%s%s%d”,dataSign, “FaceUID=”,nUserID);
sprintf(dataSign, “%s%s%d”,dataSign, “IDNumber=”,nUserID);
char secretData[64] = {0};
sprintf(secretData,"%s%s",secretData,temp_Secret);
unsigned char* result;
unsigned int len = 50;
result = (unsigned char*)malloc(sizeof(char) * len);
HMAC_CTX ctx = HMAC_CTX_new();
HMAC_CTX_reset(ctx);
// Using sha1 hash engine here.
// You may use other hash engines. e.g EVP_md5(), EVP_sha224, EVP_sha512, etc,EVP_sha1
HMAC_Init_ex(ctx, secretData, strlen(secretData), EVP_sha1(), NULL);
HMAC_Update(ctx, (unsigned char
)&dataSign, strlen(dataSign));
HMAC_Final(ctx, result, &len);
HMAC_CTX_free(ctx);
//此时result结果是HmacSHA1的原始数据值,原始数据是二进制数据流,不可直接打印,打印是乱码,可转成16进制打印

3.HmacSHA1不可以直接使用加密,需使用base64编码,官方来讲,就是HMAC计算返回原始二进制数据后进行Base64编码
int base64_encode(unsigned char *in_str, int in_len, char *out_str)
{
BIO *b64, *bio;
BUF_MEM *bptr = NULL;
size_t size = 0;
if (in_str == NULL || out_str == NULL)
return -1;
b64 = BIO_new(BIO_f_base64());
bio = BIO_new(BIO_s_mem());
bio = BIO_push(b64, bio);
BIO_write(bio, in_str, in_len);
BIO_flush(bio);
BIO_get_mem_ptr(bio, &bptr);
memcpy(out_str, bptr->data, bptr->length);
out_str[bptr->length] = ‘\0’;
size = bptr->length;
BIO_free_all(bio);
return size;
}
所以调用
char base64Data[50] = {0};
base64_encode(result,len,base64Data);

base64Data 得出28位的加密密钥 : aP/UdRQQn7wPE6aPcxoSduQUDI8=

4.base64编码返回值自带\n的换行符,所以结果也需去掉换行符
char signData[50] = {0};
strncpy(signData, tempData+0, 28);

5.有些后台提交密钥数据,要求进行URLEncode,特殊字符需转义
char *strrpc(char *str,char *oldstr,char *newstr)
{
char bstr[strlen(str)];//转换缓冲区
memset(bstr,0,sizeof(bstr));
memset(bstr, 0, strlen(str));
int i;
for(i = 0;i < strlen(str);i++){
if(!strncmp(str+i,oldstr,strlen(oldstr))){//查找目标字符串
strcat(bstr,newstr);
i += strlen(oldstr) - 1;
}else{
strncat(bstr,str + i,1);//保存一字节进缓冲区
}
}
strcpy(str,bstr);
return str;
}

void URLEncode(char *urlData)
{
if (strstr(urlData, “=”) != NULL)
strrpc(urlData,"=","%3D");
if (strstr(urlData, “/”) != NULL)
strrpc(urlData,"/","%2F");
if (strstr(urlData, “+”) != NULL)
strrpc(urlData,"+","%2B");

}
URLEncode(signData);
最终得出:aP%2FUdRQQn7wPE6aPcxoSduQUDI8%3D

头发因此白了几根。。。。。。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值