文档章节

Message Authentication Code_消息认证码算法

秋风醉了
 秋风醉了
发布于 2014/07/14 16:57
字数 1547
阅读 4489
收藏 20
点赞 1
评论 1

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=============

© 著作权归作者所有

共有 人打赏支持
秋风醉了
粉丝 229
博文 577
码字总数 407134
作品 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
Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC

加密解密,曾经是我一个毕业设计的重要组件。在工作了多年以后回想当时那个加密、解密算法,实在是太单纯了。 言归正传,这里我们主要描述Java已经实现的一些加密解密算法,最后介绍数字证书...

mrliuze
2015/05/27
0
0
Android应用安全开发之浅谈加密算法的坑

作者:阿里移动安全@伊樵,@舟海 Android开发中,难免会遇到需要加解密一些数据内容存到本地文件、或者通过网络传输到其他服务器和设备的问题,但并不是使用了加密就绝对安全了,如果加密函数...

阿里聚安全
2016/03/23
783
0
WCF Security基本概念(转载)

WCF Security 主要包括 "Transfer Security"、"Access Control"、"Auditing" 几个部分。 1. Transfer Security Transfer Security 主要包括三个方面: "消息完整性(Message Integrity)"、"消......

技术小甜
2017/11/10
0
0
HTTP Basic Authentication_基本认证机制

HTTP Basic Authentication_基本认证机制 HTTP为认证提供了一种原生工具。 尽管我们可以在HTTP的认证形式和cookie的基础上运行自己的认证工具,但在很多情况下,HTTP的原生认证功能就可以很好...

秋风醉了
2014/03/18
0
1
OpenSSH7.0兼容性测试报告

背景 2015年下,某省运营商综合网络管理系统。 按照安全管理要求,需对全系统主机的OpenSSH版本升级。 第一次测试:系统自有服务器 主机:RedHat Linux /SunOS:系统内全部主机升级,内部互...

RiboseYim
2016/01/14
2.4K
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Python数据分析numpy(1)

Python开源的科学计算基础库 1.表示N维数组对象ndarray 2.线性代数、傅里叶变换、随机数生成 3.广播函数,整合c++、c 一.数据的维度 1.数据 2.数据维度 3.一维数据 (1)特点 (2)Python中的...

十年磨一剑3344
8分钟前
0
0
csv导入Hive脚本

from pyspark.sql import HiveContexthivec = HiveContext(sc) # 创建一个hivecontext对象用于写执行SQL,sc为sparkcontext# 拼接一个字段类型字符串str_s = 'label String,'...

gulf
10分钟前
0
0
TensorFlow 隐含层 拟合 异或运算

a⊕b = (¬a ∧ b) ∨ (a ∧¬b) 数据 X = [[0, 0], [0, 1], [1, 0], [1, 1]]Y = [[0], [1], [1], [0]] 单层网络只能拟合线性问题,由于异或是非线性问题,需要使用多层网络 输入和输出 [[...

阿豪boy
24分钟前
0
0
SVN 教程

http://www.runoob.com/svn/svn-tutorial.html

yeahlife
25分钟前
0
0
在Python中,不用while和for循环遍历列表

a = [1, 2, 3, 8, 9]def printlist(l, index): if index == len(l): return else: print(l[index]) printlist(l, index + 1)printlist(a,......

丁典
26分钟前
0
0
Kubernetes使用中发现的错误及解决

运行 kubectl dashboard 时报错: Error validating service: Error getting service kubernetes-dashboard: services "kubernetes-dashboard" not found 排查 kubectl get po --all-names......

哎码
31分钟前
0
0
在git上面找开源项目遇到的坑

1,不写安装环境。 2,不写包版本 3,半成品 4,写了自动部署脚本,但是里面没有都是用默认最新包名

NLGBZJ
38分钟前
0
0
在线准考证如何保存为PDF

1.IE浏览器右键点击保存为html文件至桌面 2.将html文件打开方式选择word打开 3.word打开选择pdf进行保存

森火
42分钟前
0
0
【二】Actions, Controllers and Results

什么是Action? 一个Play应用接收到的请求一般都交给 Action 来处理。 而一个 play.api.mvc.Action 本质上就是一个 (play.api.mvc.Request => play.api.mvc.Result) 函数,它被用来处理请求并...

Landas
51分钟前
0
0
我所理解的接口设计

前言 自己做接口开发的时间也算不短了(三年),想写这篇文章其实差不多已经有一年多的时间了。我将从下面的方向来对我所理解的接口设计做个总结: 接口参数定义 -> 接口版本化的问题 -> 接口的...

度_
56分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部