3_09_GLib库入门与实践_HMAC校验

简介

MAC(Message Authentication Code,消息认证码算法)是含有密钥散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加上了密钥。因此MAC算法也经常被称作HMAC算法。

HMAC算法基于信息摘要算法,信息摘要算法有MD和SHA两大类。其中MD系列的算法有HmacMD2、HmacMD4、HmacMD5三种,SHA系列的算法有HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384、HmacSHA512五种算法。在GLib中,由于GChecksumType只有MD5、SHA1、SHA256、SHA512、SHA384,因此HAMC摘要也只支持这几种。

数据结构

Hmac摘要的数据结构是不透明结构体,只能作为整体使用,无法单独引用其内部成员。

typedef struct _GHmac GHmac;

函数列表

GHmac *	g_hmac_new ()
GHmac *	g_hmac_copy ()
GHmac *	g_hmac_ref ()
void	g_hmac_unref ()
void	g_hmac_update ()
const gchar *	g_hmac_get_string ()
void	g_hmac_get_digest ()
gchar *	g_compute_hmac_for_data ()
gchar *	g_compute_hmac_for_string ()
gchar *	g_compute_hmac_for_bytes ()

函数功能分类

// 创建Hmac对象
GHmac *	g_hmac_new ()

// 拷贝Hmac对象
GHmac *	g_hmac_copy ()

// 引用和解引用
GHmac *	g_hmac_ref ()
void	g_hmac_unref ()

// 分步计算Hmac
void	g_hmac_update ()

// 将Hmac摘要转换成字符串
const gchar *	g_hmac_get_string ()

// 获取Hmac摘要
void	g_hmac_get_digest ()

// Hmac摘要计算
gchar *	g_compute_hmac_for_data ()
gchar *	g_compute_hmac_for_string ()
gchar *	g_compute_hmac_for_bytes ()

函数功能说明及综合演示

HMAC有算法和秘钥的概念。在计算HMAC时,需要先指定使用的是哪种算法,GLib中,HMAC可以使用的算法有MD5和SHA1、SHA256、SHA512和SHA384。秘钥可以任意指定。

基于MD5的HMAC摘要计算

下面演示算法为MD5、秘钥为XYZ情况下,字符串ABCD的HMAC摘要。
示例代码如下:
源码见glib_examples\glib_hmac\glib_hmac_md5

#include <glib.h>

gint main(gint argc, gchar **argv)
{
    const guchar *key = "XYZ";
    const guchar *data = "ABCD";
    GChecksumType  digest_type = G_CHECKSUM_MD5;
    const guchar *digest_type_str = "MD5";

    GHmac *hmac = NULL;
    guint8 *digest = NULL;
    gsize digest_len = 0;
    gint i = 0;

    digest_len = g_checksum_type_get_length(digest_type);

    digest = g_malloc (digest_len);

    hmac = g_hmac_new(digest_type, key, strlen(key));
    g_hmac_update(hmac, data, strlen(data));
    g_hmac_get_digest(hmac, digest, &digest_len);

    g_print("HMAC checksum type: %s, key: %s, str:%s \n", digest_type_str, key, data);
    g_print("digest: \n");
    for(i=0; i<digest_len; i++) {
        g_print("%02x", digest[i]);
    }
    g_print("\n");

    g_free(digest);

    g_hmac_unref(hmac);

    return 0;
}

运行结果:

[root@centos7_6 build]# ./glib_hmac_md5
HMAC checksum type: MD5, key: XYZ, str:ABCD
digest:
8977ff524551d2943dfee70d5abcb25f
基于SHA1的HAMC摘要计算

下面演示算法为SHA1、秘钥为XYZ情况下,字符串ABCD的HMAC摘要。
示例代码如下:
源码见glib_examples\glib_hmac\glib_hmac_sha1

#include <glib.h>

gint main(gint argc, gchar **argv)
{
    const guchar *key = "XYZ";
    const guchar *data = "ABCD";
    GChecksumType  digest_type = G_CHECKSUM_SHA1;
    const guchar *digest_type_str = "SHA1";

    GHmac *hmac = NULL;
    guint8 *digest = NULL;
    gsize digest_len = 0;
    gint i = 0;

    digest_len = g_checksum_type_get_length(digest_type);

    digest = g_malloc (digest_len);

    hmac = g_hmac_new(digest_type, key, strlen(key));
    g_hmac_update(hmac, data, strlen(data));
    g_hmac_get_digest(hmac, digest, &digest_len);

    g_print("HMAC checksum type: %s, key: %s, str:%s \n", digest_type_str, key, data);
    g_print("digest: \n");
    for(i=0; i<digest_len; i++) {
        g_print("%02x", digest[i]);
    }
    g_print("\n");

    g_free(digest);

    g_hmac_unref(hmac);

    return 0;
}

运行结果:

[root@centos7_6 build]# ./glib_hmac_sha1
HMAC checksum type: SHA1, key: XYZ, str:ABCD
digest:
ffede163bf35566c42463da0da0a83c007dcb792
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值