文档章节

Message Authentication Code_消息认证码算法

秋风醉了
 秋风醉了
发布于 2014/07/14 16:57
字数 1547
阅读 4603
收藏 20

Message Authentication Code_消息认证码算法

内容来源于网络

部分内容摘自博客:http://blog.csdn.net/zzminer/article/details/8574287

 

MAC算法结合了MD5和SHA算法的优势,并加入密钥的支持,是一种更为安全的消息摘要算法。

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

MAC算法主要集合了MD和SHA两大系列消息摘要算法。MD系列的算法有HmacMD2、HmacMD4、HmacMD5三种算法;SHA系列的算法有HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384.HmacSHA512五种算法。

经过MAC算法得到的摘要值也可以使用十六进制编码表示,其摘要值长度与参与实现的摘要值长度相同。例如,HmacSHA1算法得到的摘要长度就是SHA1算法得到的摘要长度,都是160位二进制,换算成十六进制编码为40位。

 

MAC函数

 

MAC(Message Authentication Code)

案例:

某公司对来自网络的欺诈性订单叫苦不迭。为了改变这种局面,公司分配给每位客户一个唯一的密钥。客户每下一个订单,均需要提供订单的MAC签名(用这个密钥计算得来)。因为公司有客户的密钥,所以自然能够验证此订单:1. 是否来自所声明的客户,2.是否被篡改了。

 

有很多种结合hash函数和密钥的MAC实现方法。我们假设H 是一个hash函数,‘+’ 代表连接运算. 下面的等式便代表一个能轻松实现MAC的方法:

MAC= H( key + message )

 

但是,上述方法存在一个严重的安全漏洞:利用大部分hash函数的内部实现机制,很容易在不知道密钥的情况下,通过附加数据到message, 便能产生一个有效的MAC

 

当然还有其他容易的替代方法,比如:MAC = H(message + key) 或者 H(key +message + key)。但是它们依旧存在安全隐患。

正是这些粗陋的MAC实现方法让大家意识到需要一种靠得住的MAC实现方法,这便是HMAC的由来。

 

HMAC(Hash-based Message Authentication Code)

下面的定义抄自[RFC2104]:

HMAC (k,m) = H ( (k XOR opad ) + H( (k XOR ipad ) + m ) )

其中

  • H 是一个Hash函数, 比如, MD5, SHA-1and SHA-256,

  • k 是一个密钥,从左到右用0填充到hash函数规定的block的长度,如果密钥长度大于block的长度,就对先对输入key作hash。

  • m 是需要认证的消息,

  • + 代表“连接”运算,

  • XOR 代表异或运算,

  • opad 是外部的填充常数(0x5c5c5c…5c5c, 一个block长度的十六进制常数constant),

  • ipad 是内部的填充常数 (0x363636…3636,一个block长度的十六进制常数constant)。

特定HMAC实现需要选择一个特定的hash函数。这些不同的HMAC实现通常标记为:HMAC-MD5,HMAC-SHA1, HMAC-SHA256等等. 

 

MAC用于消息认证

 

消息认证码

密码学中,通信实体双方使用的一种验证机制,保证消息数据完整性的一种工具。

安全性依赖于Hash函数,故也称带密钥的Hash函数。

消息认证码是基于密钥和消息摘要【hash】所获得的一个值,目的是用于验证消息的完整性,确认数据在传送和存储过程中未受到主动攻击

 

Java提供的MAC算法实现

package encryption;

import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

/**
 * MAC(Message Authentication Code,消息认证码算法)是含有密钥散列函数算法,兼容
 * 了MD和SHA算法的特性,并在此基础上加入了密钥。因此,我们也常把MAC称为HMAC
 * (keyed-Hash Message Authentication Code)。
 * <p/>
 * Java 6实现
 * HmacMD5 128
 * HmacSHA1 160
 * HmacSHA256 256
 * HmacSHA384 384
 * HmacSHA512 512
 */
public class MACCoder {
    /**
     * 初始化HmacMD5密钥
     *
     * @return byte[] 密钥
     * @throws Exception
     */
    public static byte[] initHmacMD5Key() throws Exception {
        // 初始化KeyGenerator
        KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5");
        // 产生密钥
        SecretKey secretKey = keyGenerator.generateKey();
        // 获得密钥
        return secretKey.getEncoded();
    }

    /**
     * HmacMD5消息摘要
     *
     * @param data 待做摘要处理的数据
     * @param key  密钥
     * @return byte[] 消息摘要
     * @throws Exception
     */
    public static byte[] encodeHmacMD5(byte[] data, byte[] key)
            throws Exception {
        // 还原密钥
        SecretKey secretKey = new SecretKeySpec(key, "HmacMD5");
        // 实例化Mac
        Mac mac = Mac.getInstance(secretKey.getAlgorithm());
        // 初始化Mac
        mac.init(secretKey);
        // 执行消息摘要
        return mac.doFinal(data);
    }

    /**
     * 初始化HmacSHA1密钥
     *
     * @return byte[] 密钥
     * @throws Exception
     */
    public static byte[] initHmacSHAKey() throws Exception {
        // 初始化KeyGenerator
        KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacSHA1");
        // 产生密钥
        SecretKey secretKey = keyGenerator.generateKey();
        // 获得密钥
        return secretKey.getEncoded();
    }

    /**
     * HmacSHA1消息摘要
     *
     * @param data 待做摘要处理的数据
     * @param key  密钥
     * @return byte[] 消息摘要
     * @throws Exception
     */
    public static byte[] encodeHmacSHA(byte[] data, byte[] key)
            throws Exception {
        // 还原密钥
        SecretKey secretKey = new SecretKeySpec(key, "HmacSHA1");
        // 实例化Mac
        Mac mac = Mac.getInstance(secretKey.getAlgorithm());
        // 初始化Mac
        mac.init(secretKey);
        // 执行消息摘要
        return mac.doFinal(data);
    }

    /**
     * 初始化HmacSHA256密钥
     *
     * @return byte[] 密钥
     * @throws Exception
     */
    public static byte[] initHmacSHA256Key() throws Exception {
        // 初始化KeyGenerator
        KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacSHA256");
        // 产生密钥
        SecretKey secretKey = keyGenerator.generateKey();
        // 获得密钥
        return secretKey.getEncoded();
    }

    /**
     * HmacSHA256消息摘要
     *
     * @param data 待做摘要处理的数据
     * @param key  密钥
     * @return byte[] 消息摘要
     * @throws Exception
     */
    public static byte[] encodeHmacSHA256(byte[] data, byte[] key) throws Exception {
        // 还原密钥
        SecretKey secretKey = new SecretKeySpec(key, "HmacSHA256");
        // 实例化Mac
        Mac mac = Mac.getInstance(secretKey.getAlgorithm());
        // 初始化Mac
        mac.init(secretKey);
        // 执行消息摘要
        return mac.doFinal(data);
    }

    /**
     * 初始化HmacSHA384密钥
     *
     * @return byte[] 密钥
     * @throws Exception
     */
    public static byte[] initHmacSHA384Key() throws Exception {
        // 初始化KeyGenerator
        KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacSHA384");
        // 产生密钥
        SecretKey secretKey = keyGenerator.generateKey();
        // 获得密钥
        return secretKey.getEncoded();
    }

    /**
     * HmacSHA384消息摘要
     *
     * @param data 待做摘要处理的数据
     * @param key  密钥
     * @return byte[] 消息摘要
     * @throws Exception
     */
    public static byte[] encodeHmacSHA384(byte[] data, byte[] key) throws Exception {
        // 还原密钥
        SecretKey secretKey = new SecretKeySpec(key, "HmacSHA384");
        // 实例化Mac
        Mac mac = Mac.getInstance(secretKey.getAlgorithm());
        // 初始化Mac
        mac.init(secretKey);
        // 执行消息摘要
        return mac.doFinal(data);
    }

    /**
     * 初始化HmacSHA512密钥
     *
     * @return byte[] 密钥
     * @throws Exception
     */
    public static byte[] initHmacSHA512Key() throws Exception {
        // 初始化
        KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacSHA512");
        // 产生密钥
        SecretKey secretKey = keyGenerator.generateKey();
        // 获得密钥
        return secretKey.getEncoded();
    }

    /**
     * HmacSHA512消息摘要
     *
     * @param data 待做摘要处理的数据
     * @param key  密钥
     * @return byte[] 消息摘要
     * @throws Exception
     */
    public static byte[] encodeHmacSHA512(byte[] data, byte[] key) throws Exception {
        // 还原密钥
        SecretKey secretKey = new SecretKeySpec(key, "HmacSHA512");
        // 实例化Mac
        Mac mac = Mac.getInstance(secretKey.getAlgorithm());
        // 初始化Mac
        mac.init(secretKey);
        // 执行消息摘要
        return mac.doFinal(data);
    }
}

=============END=============

© 著作权归作者所有

共有 人打赏支持
秋风醉了
粉丝 236
博文 577
码字总数 418437
作品 0
朝阳
程序员
加载中

评论(1)

ismdeep
ismdeep
顶~~
VC++网络安全编程范例(3)-消息鉴别码MAC算法编程

消息鉴别码(Message Authentication Code)也叫密码校验和(cryptographic checksum),鉴别函数的一种. 消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个...

junwong
2012/03/09
0
0
理解 HMAC-Based One-Time Password Algorithm

Two-Factor Authentication and One-Time Password 双因子认证(Two-Factor Authentication)认证是指结合密码以及实物(令牌、SMS等)两种条件对用户进行认证的方法,提高了系统的安全性。一次性...

koala bear
2016/04/05
0
0
【Java小工匠聊密码学】--消息摘要--概述

1、消息摘要概述   数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名、数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密。...

追梦着
06/10
0
0
Java基础之4大基本加密算法解析

BASE64 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。Base64编码可用于在HTTP环境下传递较长的标识信息。例如,在Jav...

白志华
2015/09/19
51
0
详解Node.js API系列 Crypto加密模块(1)

MD5加密算法 算法简介 MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由Mit Laboratory for Computer Science和Rsa data security inc的Ronald l. rivest开发出来,经...

maweitao
2014/08/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

数字转换为字符的L受哪个参数影响

我们知道,如果想把金额带上本位币,一般加上L, 比如: select to_char(salary,'L99,9999.00') from employees; 下面显示如下: SALARY TO_CHAR(SALARY,'L99, 2900 ¥2,900.00 2500 ¥2,500.00 ...

tututu_jiang
16分钟前
0
0
shell编程(告警系统主脚本、告警系统配置文件、告警系统监控项目)

告警系统主脚本 先定义监控系统的各个目录,然后再去定义主脚本,因为是分布式的,所以需要每台机器都这样做,如果事先有创建好各个目录和各个脚本,那么就可以把这些目录和脚本copy到其他机...

蛋黄_Yolks
16分钟前
0
0
SAP HANA Backup and Recovery

SAP HANA Backup and Recovery Skip to end of metadata Created by Paul Power, last modified on Nov 23, 2017 Go to start of metadata Purpose System Privileges How to Perform a Back......

rootliu
18分钟前
0
0
JVM的持久代——何去何从?

本文会介绍一些JVM内存结构的基本概念,然后很快会讲到持久代,来看下Java SE 8发布后它究竟到哪去了。 基础知识 JVM只不过是运行在你系统上的另一个进程而已,这一切的魔法始于一个java命令...

java知识分子
34分钟前
0
0
Hive和HBase的区别

hive是文件的视图,hbase是建了索引的key-value表。 先放结论:Hbase和Hive在大数据架构中处在不同位置,Hbase主要解决实时数据查询问题,Hive主要解决数据处理和计算问题,一般是配合使用。...

飓风2000
41分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部