HMAC 单向散列消息认证码

消息认证码MAC是用于确认完整性并进行认证的技术,消息认证码的输入包括任意长度的消息和一个发送者和接收者之间共享的密钥(可能还需要共享盐值)。

HMAC是使用单向散列函数来构造消息认证码的方法,任何高强度单向散列函数都可以被用于HMAC,具体方法如下图所示。

发送者需要同时把消息和认证码发送给接收者,接收者接收了两者,并根据接收到的消息和共享的密钥生成认证码进行比较。如果相同则消息未被篡改且认证成功。

MAC不能保证信息的机密性!MAC无法对第三方"C"证明,因为"A","B"两者都有密钥,都可以生成消息和MAC。因此第三方不知道是谁生成的,更不知道消息的真实性。MAC无法防止否认。

加盐

盐是通过伪随机数生成器生成的随机数,会和密钥一起被输入单向散列函数。

主要目的是为了防御字典攻击。字典攻击是一种事先进行计算并准备好候选密钥列表的方法。是一种暴力攻击破解手段。加了盐,密钥便多了n个数量级的可能,加大破解难度。

HMAC利用单向散列函数的单向性和抗碰撞性来保证无法根据MAC值推测出密钥。

代码

package main

import (
"crypto/hmac"
"crypto/rand"
"crypto/sha256"
"crypto/sha512"
"encoding/base64"
"fmt"
"hash"
"io"
) var secretKey = "114514abcdefghijklmn"
var salt = generateSalt() // 生成一个包含 16 字节数据的盐字符串
func generateSalt() string {
randomBytes := make([]byte, 16)
if _, err := rand.Read(randomBytes); err != nil {
return ""
}
return base64.URLEncoding.EncodeToString(randomBytes)
} // 提供散列函数、密钥、盐值、消息返回HMAC
func HMAC(h func() hash.Hash, secretKey string, salt string, message string) []byte {
hash := hmac.New(h, []byte(secretKey))
io.WriteString(hash, message+salt)
return hash.Sum(nil)
} func main() {
/* ----------------------------------- 发送方 ---------------------------------- */
message := "A请求B转账10000"
fmt.Println("\n\t消息: " + message)
fmt.Println("\t加盐: " + salt) fmt.Printf("\n\tHMAC-Sha256: %x", HMAC(sha256.New, secretKey, salt, message))
fmt.Printf("\n\tHMAC-Sha256: %x", HMAC(sha512.New, secretKey, salt, message)) /* ----------------------------------- 修改一个字母 ---------------------------------- */ messageChange := "C请求B转账10000" fmt.Printf("\n\n\tHMAC-Sha256: %x", HMAC(sha256.New, secretKey, salt, messageChange))
fmt.Printf("\n\tHMAC-Sha256: %x\n\n", HMAC(sha512.New, secretKey, salt, messageChange)) /* --------------------------- 接收方分别收到了发送者的消息、HMac值 -------------------------- */
// ^ 假定消息和HMAC均被黑客截获,黑客进行重放攻击
sendMessgage := message // @ 发送者发送消息
sendHMAC := string(HMAC(sha256.New, secretKey, salt, sendMessgage)) // @ 发送者计算HMAC并与消息一起发给接收者
hackerGetHMAC := sendHMAC // @ 黑客窃听到HMAC
hackerGetMessage := sendMessgage // @ 黑客窃听到消息
receiveHMAC := hackerGetHMAC // @ 接收者收到HMAC
receiveMessage := hackerGetMessage // @ 接收者收到MESSAGE
if string(HMAC(sha256.New, secretKey, salt, receiveMessage)) == receiveHMAC {
fmt.Println("\t第1次重放攻击" + message)
}
receiveHMAC = hackerGetHMAC // @ 接收者收到HMAC
receiveMessage = hackerGetMessage // @ 接收者收到MESSAGE
if string(HMAC(sha256.New, secretKey, salt, receiveMessage)) == receiveHMAC {
fmt.Println("\t第2次重放攻击" + message)
}
// ^ 假定消息和HMAC都是黑客发送的,但黑客并不知道密钥和盐值
sendMessgage = "今天是KFC V我小能喵喵喵50速速" // @ 发送者发送消息
sendHMAC = string(HMAC(sha256.New, "miyueshishenme", "114514", sendMessgage)) // @ 黑客计算HMAC并与消息一起发给接收者
receiveHMAC = sendHMAC // @ 接收者收到HMAC
receiveMessage = sendMessgage // @ 接收者收到MESSAGE
if string(HMAC(sha256.New, secretKey, salt, receiveMessage)) != receiveHMAC {
fmt.Println("\t消息不一致、认证失败")
}
}
PS C:\Users\小能喵喵喵\Desktop\Go\Cryptography\HMAC> go run .

    消息: A请求B转账10000
加盐: S_XlM8K_dhAvsgch_N3o1w== HMAC-Sha256: b8dd30d2a418262494f298bcdaf6c12f442c6e8f89a31822dad03561887f3bed
HMAC-Sha256: ba934567837ec98ba89853b09f6652ce56955cfeedd0c4495bd6cba7fc2f8293635fdc59b90180564bd0fdb1d1bffc52644fc2bd8164d6379ae11510e200954c HMAC-Sha256: 2db84d209e2418f314fc5bb0583cfb50cde90d954d8493d3ed0e3b369fb092d7
HMAC-Sha256: 7b192cedb1d89fd71889189a0094e1df06d26d977bc3bed4f53b16928aa2d58084cb8890d52cb40f665bb9ac62eeb4092495efe7d59292470ed597a3536dea56 第1次重放攻击A请求B转账10000
第2次重放攻击A请求B转账10000
消息不一致、认证失败

如何防止重放攻击

  • 给消息加序号,收发双方约定好
  • 时间戳,收发双方必须考虑到通信延迟,还是会存在重放攻击的空间。
  • 接收者发送一次性随机数,发送者HMAC该随机数后发送。确保当前消息只能发一次。

密码学奇妙之旅、03 HMAC单向散列消息认证码、Golang代码的更多相关文章

  1. 【Java-加密算法】对称加密、非对称加密、单向散列(转)

    一提到加密,就会联想到数字签名,这两个经常被混淆的概念到底是什么呢? 加密:加密是一种以密码方式发送信息的方法.只有拥有正确密钥的人才能解开这个信息的密码.对于其他人来说,这个信息看起来就像是一系列随 ...

  2. 29.密码学知识-消息认证码MAC-6——2019年12月19日

    1. 消息认证码 1.1 消息认证 消息认证码(message authentication code)是一种确认完整性并进行认证的技术,取三个单词的首字母,简称为MAC. 思考改进方案? 从哈希函数 ...

  3. 密码学初级教程(五)消息认证码MAC-Message Authentication Code

    密码学家工具箱中的6个重要的工具: 对称密码 公钥密码 单向散列函数 消息认证码 数字签名 伪随机数生成器 MAC能识别出篡改和伪装,也就是既可以确认消息的完整性,也可以进行认证. 消息认证码的输入包 ...

  4. Shiro+springboot+mybatis+EhCache(md5+salt+散列)认证与授权-03

    从上文:Shiro+springboot+mybatis(md5+salt+散列)认证与授权-02 当每次进行刷新时,都会从数据库重新查询数据进行授权操作,这样无疑给数据库造成很大的压力,所以需要引入 ...

  5. hmac库 密钥相关的哈希运算消息认证码

    # -*- coding: cp936 -*- #xiaodeng #python 2.7.10 #HMAC是密钥相关的哈希运算消息认证码,HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一 ...

  6. HMAC哈希消息认证码

    收藏 137 14   hmac 编辑 HMAC是密钥相关的哈希运算消息认证码,HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出.   中文名 哈希消息认证码 外文名 H ...

  7. Shiro+springboot+mybatis(md5+salt+散列)认证与授权-02

    代码延续地址:Shiro+springboot+mybatis(md5+salt+散列)认证与授权-01 1.创建t_role角色表(比如管理员admin,普通用户user等),创建t_pers权限表 ...

  8. 密码学奇妙之旅、02 混合加密系统、AES、RSA标准、Golang代码

    CTR 计数器模式 计数器模式CTR是分组密码模式中的一种.通过将逐次累加的计数器进行加密来生成密钥流的流密码.每次加密时会生成一个不同的值来作为计数器的初始值. 可以事先进行加密.解密的准备. 加密 ...

  9. Shiro+springboot+mybatis(md5+salt+散列)认证与授权-01

    这个小项目包含了注册与登录,使用了springboot+mybatis+shiro的技术栈:当用户在浏览器登录时发起请求时,首先这一系列的请求会被拦截器进行拦截(ShiroFilter),然后拦截器根 ...

随机推荐

  1. 翟佳:高可用、强一致、低延迟——BookKeeper的存储实现

    分享嘉宾:翟佳 StreamNative 联合创始人 编辑整理:张晓伟 美团点评 出品平台:DataFunTalk 导读:多数读者们了解BookKeeper是通过Pulsar,实际上BookKeepe ...

  2. DP の 百题大过关(5/100)

      动态规划自古以来是DALAO凌虐萌新的分水岭,但有些OIer认为并没有这么重要--会打暴力,大不了记忆化.但是其实,动态规划学得好不好,可以彰显出一个OIerOIer的基本素养--能否富有逻辑地思 ...

  3. Win10系统下搭建Go lang开发环境更换国内源并且体验宇宙最快框架Iris

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_156 最近有同学开始尝试接触Go lang,拥抱新技术永远都会是一个好习惯,之前的一篇文章介绍了如何在Mac os系统下配置Go ...

  4. 彻底弄清楚session,cookie,sessionStorage,localStorage的区别及应用场景(面试向)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_94 客户端状态保持是一个老生常谈的问题了,归根结底追踪浏览器的用户身份及其相关数据无非就是以下四种方式:session,cooki ...

  5. 你有对象类,我有结构体,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang结构体(struct)的使用EP06

    再续前文,在面向对象层面,Python做到了超神:万物皆为对象,而Ruby,则干脆就是神:飞花摘叶皆可对象.二者都提供对象类操作以及继承的方式为面向对象张目,但Go lang显然有一些特立独行,因为它 ...

  6. Spring源码 12 IOC refresh方法7

    本文章基于 Spring 5.3.15 Spring IOC 的核心是 AbstractApplicationContext 的 refresh 方法. 其中一共有 13 个主要方法,这里分析第 7 ...

  7. 275. H 指数 II--Leetcode_二分

    来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/h-index-ii 著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注明出处. 题目的大意是 ...

  8. 微软Azure配置中心 App Configuration (一):轻松集成到Asp.Net Core

    写在前面 在日常开发中,我这边比较熟悉的配置中心有,携程Apollo,阿里Nacos(配置中心,服务治理一体) 之前文章: Asp.Net Core与携程阿波罗(Apollo)的第一次亲密接触 总体来 ...

  9. 👍CleanShot X 3.1.1 破解版 (超强屏幕截图录像工具) (TNT + 免激活)

    软件语言为ENGLISH,英文不好的劝退! 软件介绍/功能 CleanShot X 3 是一款Mac超强截图以及屏幕录制工具.支持:区域截图.窗口截图.滚动截图.延时截图.屏幕录制.贴图.截图时隐藏桌 ...

  10. 从零开始Blazor Server(15)--总结

    我们用了14篇文章,基本上把一个后台管理系统需要的UI部分都说的差不多了.所以这套文章也该到了结束的时候了. 这里面有很多问题,比如我们直接使用UI来拉数据库信息而没有使用service,再比如我们大 ...