消息认证码HMAC算法的OpenSSL代码实现Demo

目录

1 什么是消息认证码

2 什么是HMAC

3 OpenSSL EVP代码实现

3.1 EVP_MD结构体

3.2 相关函数

4 演示Demo

4.1 开发环境

4.2 功能介绍

4.3 下载地址

5 参考资料


1 什么是消息认证码

        消息认证码(Message Authentication Code)是一种确认完整性并进行认证的技术,取三个单词的首字母,简称为MAC。

        消息认证码的输入包括任意长度的消息和一个发送者与接收者之间共享的密钥,它可以输出固定长度的数据,这个数据称为MAC值。

        根据任意长度的消息输出固定长度的数据,这一点和单向散列函数很类似。但是单向散列函数中计算散列值时不需要密钥,相对地,消息认证码中则需要使用发送者与接收者之间共享的密钥。

        要计算MAC必须持有共享密钥,没有共享密钥的人就无法计算MAC值,消息认证码正是利用这一性质来完成认证的。此外,和单向散列函数的散列值一样,哪怕消息中发生1比特的变化,MAC值也会产生变化,消息认证码正是利用这一性质来确认完整性的。

        消息认证码可以简单理解为是一种与密钥相关联的单向散列函数。

单向散列函数与消息认证码的比较

2 什么是HMAC

        HMAC是一种使用单向散列函数来构造消息认证码的方法(RFC2104),其中HMAC的H就是Hash的意思。

        HMAC 中所使用的单向散列函数并不仅限于一种,任何高强度的单向散列函数都可以被用于HMAC,如果将来设计出新的单向散列函数,也同样可以使用。

        使用SHA-1、SHA-224、SHA-256、SHA-384、SHA-512所构造的HMAC,分别称为HMAC-

SHA1、HMAC-SHA-224、HMAC-SHA-256、HMAC-SHA-384、HMAC-SHA-512。

3 OpenSSL EVP代码实现

        OpenSSL EVP(high-level cryptographic functions)提供了丰富的密码学中的各种函数。OpenSSL中实现了各种对称算法、摘要算法以及签名/验签算法。EVP 函数将这些具体的算法进行了封装。 EVP系列的函数的声明包含在”evp.h”里面,这是一系列封装了OpenSSL加密库里面所有算法的函数。通过这样的统一的封装,使得只需要在初始化参数的时候做很少的改变,就可以使用相同的代码但采用不同的加密算法进行数据的加密和解密。 EVP系列函数主要封装了加密、摘要、编码三大类型的算法,使用算法前需要调OpenSSL_add_all_algorithms函数。

3.1 EVP_MD结构体

        所有的摘要算法都维护着指向下面定义的结构体的一个指针,在此基础上实现了算法的功能。该结构EVP_MD如下:

#include<opessl/evp.h>
typedef struct env_md_st
{ 
     int type;     //信息摘要算法的NID标识
     int pkey_type;//是信息摘要-签名算法体制的相应NID标识,如NID_shaWithRSAEncryption
     int md_size;  //是信息摘要算法生成的信息摘要的长度,如SHA算法是SHA_DIGEST_LENGTH,该值是20
     unsigned long flags;
     int (*init)(EVP_MD_CTX *ctx);
               //指向一个特定信息摘要算法的初始化函数,如对于SHA算法,指针指向SHA_Init
     int (*update)(EVP_MD_CTX *ctx,const void *data,unsigned long count); 
               //指向一个真正计算摘要值的函数,例如SHA算法就是指向SHA_Update
     int (*final)(EVP_MD_CTX *ctx,unsigned char *md);
               //指向一个信息摘要值计算之后要调用的函数,该函数完成最后的一块数据的处理工作。例如SHA算法就是指向SHA_Final.
     int (*copy)(EVP_MD_CTX *to,const EVP_MD_CTX *from);
               //指向一个可以在两个EVP_MD_CTX结构之间拷贝参数值的函数
     int (*cleanup)(EVP_MD_CTX *ctx);
     /* FIXME: prototype these some day */
     int (*sign)();   //签名
     int (*verify)(); //认证
     int required_pkey_type[5];
                      //指向一个用来签名的算法EVP_PKEY的类型,如SHA算法就指向EVP_PKEY_RSA_method
     int block_size;  //一个用来进行信息摘要的输入块的的长度(单位是字节),如SHA算法就是SHA_CBLOCK
     int ctx_size;    //是CTX结构的长度,在SHA算法里面应该就是sizeof(EVP_MD*)+sizeof(SHA_CTX)
     /* control function */
     int (*md_ctrl) (EVP_MD_CTX *ctx, int cmd, int p1, void *p2);
 } EVP_MD;

3.2 相关函数

/********************************************************************************
    功    能:获取摘要结构算法的NID
    参    数:name - [in] 摘要算法名称
    返    回: 摘要结构算法的NID
    备    注:EVP_get_digestbyname(sha256返回NID_sha1()。如果算法不存在,返回null。
********************************************************************************/
const EVP_MD *EVP_get_digestbyname(const char *name);

/********************************************************************************
    功    能:HMAC计算
    参    数:EVP_MD - [in] 计算摘要算法的NID(类似:EVP_sha1())
             key    - [in] 秘钥
             key_len- [in] 秘钥的长度
             data   - [in] 需要进行摘要计算的的串
             count  - [in] 进行摘要计算的串的长度
             md     - [out]计算出的摘要值
             size   - [out]计算出的摘要值的长度
             
    返    回:
********************************************************************************/
unsigned char *HMAC(const EVP_MD *evp_md, const void *key, int key_len,
                    const unsigned char *d, size_t n, unsigned char *md,
                    unsigned int *md_len);

4 演示Demo

4.1 开发环境

  • OpenSSL 1.0.2l

  • Visual Studio 2015

  • Windows 10 Pro x64

4.2 功能介绍

        演示程序主界面如下图所示,包括摘要算法设置,输入/输出数据格式设置以及HMac计算等功能。

        支持MD5、SHA1、SHA224、SHA256、SHA384、SHA512等摘要算法,分别称为HMAC-

MD5、HMAC-SHA1、HMAC-SHA224、HMAC-SHA256、HMAC-SHA384、HMAC-SHA512。

        支持String(文本)、Hex(十六进制)、Base64等多种数据格式。

4.3 下载地址

        开发环境:

  • Windows 10 pro x64

  • Visual Studio 2015

  • OpenSSL 1.0.2l

        下载地址: 消息认证码算法的OpenSSL代码实现Demo

5 参考资料

        https://blog.csdn.net/woaiclh13/article/details/121096898

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值