简介
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