1、HMAC简介

1MAC(Message Authentication Code,消息认证码算法),可以将其认为是含有秘钥的散列(Hash)函数算法;即兼容了MDSHA算法,并在此基础上加上了秘钥。因此MAC算法也经常被称作HMAC算法。当然HMAC就是“基于Hash的消息认证码”英文(Hash-based Message Authentication Code)的缩写。我个人理解它主要包括两块:一个是信息摘要算法(MD/SHA);另外就是秘钥。

    1HMAC基于的信息摘要算法。目前主要集合了MD和SHA两大系列消息摘要算法。其中MD系列的算法有HmacMD2、HmacMD4、HmacMD5三种算法;SHA系列的算法有HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384、HmacSHA512五种算法。

    2)秘钥。理论上密钥可以是任何长度,但是一般出于安全强度的考量不建议使用太短的秘钥。也就是说一般情况下要使用摘要算法计算密钥的摘要作为新的密钥。

2)使用流程。你和对方共享了一个密钥K,你要发消息给对方;这个过程即要保证消息没有被篡改还要能够证明信息确实是你本人发送的。所以处理的方式是:在发送数据以前,HMAC算法对数据块+约定的公钥进行散列操作并将所生成摘要”附加在待发送的数据块中。当数据和摘要到达其目的地时,目的端也会使用HMAC算法对原数据块和公钥来生成本地摘要,如果两个摘要相匹配,那么就认为数据未被做任何篡改且消息为约定的对方本人发送

(3)加深理解。

1)其实通过MD5、SHA1等哈希算法我们可以验证一段数据是否有效,方法就是对比该数据的哈希值。例如判断用户的口令(密码)是否正确我们用保存在数据库中的password_md5对比计算得到的md5(password),如果一致就认为用户输入的密码是正确的。

2)由于用户密码通常会设置的比较简单而且具有普遍性,如果黑客做了足够大的对照表实际上就很有可能反推出真实密码。为了防止黑客通过对照表反推到原始密码,通常在计算哈希的时候会增加一个salt以使得相同的输入(这里指不同用户的相同密码)也能达到不同的哈希(例如将每个用户的唯一id作为salt的一部分),这样就大大的增加了破解难度。

3)实际上我们可以把上面说的salt看做是一个“口令”,所以加salt的哈希就是:计算一段message的哈希时,根据不同的口令计算出不同的哈希。即,要验证哈希值必须同时提供口令。上面的这个思路实际上就是Hmac算法了,它通过一个标准算法,在计算哈希的过程中把key混入计算过程。和我们自定义的加salt算法不同,Hmac算法针对所有的哈希算法都通用,无论是MD5还是SHA-1。其实可以认为Hmac算法和我们自定义的加salt的哈希算法本质上就是一个东西。但是使用Hmac替代我们自己的salt算法可以使程序算法更标准话,也更安全

2、实例程序(打包代码 这里下载 )

(1)algo_hmac.h

#ifndef _ALGO_HMAC_H_
#define _ALGO_HMAC_H_int HmacEncode(const char * algo,const char * key, unsigned int key_length,const char * input, unsigned int input_length,unsigned char * &output, unsigned int &output_length);#endif

(2)algo_hmac.cpp

#include "algo_hmac.h"
#include <openssl/hmac.h>
#include <string.h>
#include <iostream>
using namespace std;int HmacEncode(const char * algo, const char * key, unsigned int key_length, const char * input, unsigned int input_length, unsigned char * &output, unsigned int &output_length) {const EVP_MD * engine = NULL;if(strcasecmp("sha512", algo) == 0) {engine = EVP_sha512();}else if(strcasecmp("sha256", algo) == 0) {engine = EVP_sha256();}else if(strcasecmp("sha1", algo) == 0) {engine = EVP_sha1();}else if(strcasecmp("md5", algo) == 0) {engine = EVP_md5();}else if(strcasecmp("sha224", algo) == 0) {engine = EVP_sha224();}else if(strcasecmp("sha384", algo) == 0) {engine = EVP_sha384();}else if(strcasecmp("sha", algo) == 0) {engine = EVP_sha();}else if(strcasecmp("md2", algo) == 0) {engine = EVP_md2();}else {cout << "Algorithm " << algo << " is not supported by this program!" << endl;return -1;}output = (unsigned char*)malloc(EVP_MAX_MD_SIZE);/*---------------------------------这块应该是相对通用的计算流程了--------------------------------*/HMAC_CTX ctx;HMAC_CTX_init(&ctx);HMAC_Init_ex(&ctx, key, strlen(key), engine, NULL);HMAC_Update(&ctx, (unsigned char*)input, strlen(input));  // input is OK; &input is WRONG !!!HMAC_Final(&ctx, output, &output_length);HMAC_CTX_cleanup(&ctx); return 0;
}

(3)main.cpp

#include "algo_hmac.h"
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;int main(int argc, char * argv[])
{if(argc < 2) {//参数指定hash算法,支持HmacEncode列举的那些cout << "Please specify a hash algorithm!" << endl;return -1;}char key[] = "fasdkgjl;asdfjg;dsfjgasdsr";//secret keystring data = "/pic/small/3007024147/8ba5a744-f48d-4ba2-b93f-da17e7f52dff";//要加密传输的数据unsigned char * mac = NULL;unsigned int mac_length = 0;int ret = HmacEncode(argv[1], key, strlen(key), data.c_str(), data.length(), mac, mac_length);   if(0 == ret) {cout << "Algorithm HMAC encode succeeded!" << endl;}else {cout << "Algorithm HMAC encode failed!" << endl;return -1;}cout << "mac length: " << mac_length << endl;cout << "mac:";for(int i = 0; i < mac_length; i++) {printf("%-03x", (unsigned int)mac[i]);}cout << endl;if(mac) {free(mac);cout << "mac is freed!" << endl;}return 0;
}

(4)Makefile

LNK_OPT = -g -L/usr/lib64/ -lssl  -L/lib64/ -lcryptoall:rm -f *.orm -f testg++ -g -c algo_hmac.cppg++ -g main.cpp -o test algo_hmac.o $(LNK_OPT)clean:rm -f *.orm -f test

3、执行效果

执行效果如下:

各种算法得到的摘要长度如下:

算法 摘要长度(字节)
MD2 16
MD5 16
SHA 20
SHA1 20
SHA224 28
SHA256 32
SHA384 48
SHA512 64

参考:https://blog.csdn.net/yasi_xi/article/details/9066003

openssl做HMAC实例(C++)相关推荐

  1. 用OpenSSL做自签名的证书(by quqi99)

    作者:张华 发表于:2014-04-18 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 (http://blog.csdn.net/quqi99 ) 注:cs ...

  2. php openssl做什么,php开启openssl的方法

    php开启openssl的方法 关注:294  答案:2  mip版 解决时间 2021-02-02 21:13 提问者笑低了眉眼 2021-02-02 05:23 我是一个小白,对于php完全不懂, ...

  3. php openssl做什么,php php_openssl.dll文件有什么用?

    本篇文章是对php中php_openssl.dll的作用进行了详细的分析介绍,需要的朋友参考下 一.openssl简介数据加密是信息信息传输中的一个重要组成部分.任何信息都以明文方式传输,确实是个很不 ...

  4. php鼠标经过显示文本,CSS_HTML和CSS做网页实例教程:鼠标滑过文字改变,关于HTML+CSS的实例效果很多, - phpStudy...

    关于HTML+CSS的实例效果很多,下面举出常用的几列,供新手们学习参考. html+CSS实例效果(1):鼠标滑过改变文字 鼠标经过变换文字 #Menu{ width:500px; margin:5 ...

  5. php做网页的表格,dreamweaver做网页实例教程 利用表格美化页面

    在浏览网页的时候可以发现,很多用于网站排版的表格都是经过美化处理的,这些表格不仅起了布局排版的作用,而且在很大程度上美化了网页,使网页看起来更加漂亮.新颖. 效果说明 利用表格美化页面的方式有很多种. ...

  6. 3.odoo13之跟着官网做项目/实例(模型关联,模型类模型表的关联)

    1.建立房地产属性类型的表 还是在models中的estate_property.py中, 并且添加关联,让房地产表和属性表关联起来, 并且加上买方和销售人员,默认系统的模型表, 完整estate_p ...

  7. 2.odoo13之跟着官网做项目/实例(创建菜单,创建action,创建视图、搜索过滤器,分组)

    目录 1.创建菜单 2.创建动作,action 3.运行程序,创建数据 4.添加自定义列表视图(树视图) 5.添加表单视图 6.添加搜索视图 7.搜索视图的过滤器,以及搜索分组 1.创建菜单 在vie ...

  8. 1.odoo13之跟着官网做项目/实例(创建模块、创建模型类、配置角色安全权限文件)

    目录 1.创建模块 2.运行程序,安装上模块 3.创建模型类 4.配置角色安全权限文件 1.创建模块 在主目录下,新建custom的文件夹 进入到pycharm中的命令行,创建estate命令 pyt ...

  9. python 删除特定行数据_怎么用 Python 做数据分析实例

    01 生成数据表 第一部分是生成数据表,常见的生成方法有两种,第一种是导入外部数据,第二种是直接写入数据. Excel 中的文件菜单中提供了获取外部数据的功能,支持数据库和文本文件和页面的多种数据源导 ...

  10. python数据表元素不为空值_python 填充空值失败_怎么用 Python 做数据分析实例

    01 生成数据表 第一部分是生成数据表,常见的生成方法有两种,第一种是导入外部数据,第二种是直接写入数据. Excel 中的文件菜单中提供了获取外部数据的功能,支持数据库和文本文件和页面的多种数据源导 ...

最新文章

  1. 太赫兹芯片是什么原理_太赫兹波养生鞋 芯片、鞋垫和材质的详细了解专利技术~太赫兹芯...
  2. 2.2.7 局部最优化问题
  3. 重磅 !间隔分析正式上线,神策数据分析能力再度增强
  4. 强烈推荐!孩子的科普从这套全球畅销250万册的最酷科学书起步
  5. 使用JMSTester对JMS层进行基准测试
  6. Oracle存储过程(转)
  7. python3之批量修改文件名称
  8. 牛客 2021年度训练联盟热身训练赛第二场 D题Soccer Standings
  9. 计算机集成项目经理 培训,计算机信息系统集成项目经理培训总结.doc
  10. matlab电力系统潮流计算软件matpower_衡真课堂 | 电力系统稳态与暂态分析
  11. Bearcat pomelo game 实战 -- treasures
  12. 短视频从业者实操资料大全(含代运营案例+报价单+合同协议 +分镜头脚本+管理运营)共180份
  13. 27岁研究生毕业年龄大吗?
  14. Symantec赛门铁克支持型SSL服务器证书_网站安全SSL数字证书认证
  15. 【安装系统】U盘安装系统教程,使用UltraISO制作U盘启动盘
  16. C语言游戏之贪吃蛇--链表实现
  17. After Effects CC SDK 使用指南(二)—— 第一章 介绍 (上)
  18. 老调重弹:JDBC系列之驱动加载原理全面解析)
  19. 电机与matlab突然,同步电机的三相突然短路的MATLAB计算
  20. php用css改变字体,css怎么设置字体立体

热门文章

  1. 将图的广度优先遍历在邻接矩阵和邻接表存储结构上分别实现_《青岛大学-王卓-数据结构》B站学习...
  2. 力扣-148 排序链表
  3. 1031 查验身份证 (15 分)—PAT (Basic Level) Practice (中文)
  4. jQuery 移除事件
  5. 命令行批量修改IP并ping测试
  6. ScaleAnimation缩放动画Demo
  7. LVS部分调度算法的适应场景分析
  8. 计算机网络网络层之IP协议(1)——IP数据报
  9. Kubernetes详解(二十五)——Deployment控制器扩容
  10. Ansible详解(七)——Ansible palybook简单使用