Go-哈希函数与消息认证详解(含代码)_go hash函数(1)

H

(

M

1

)

=

H

(

M

2

)

H(M_1)=H(M_2)

H(M1​)=H(M2​)在计算上是不可行的。

  • 随机性:当一个输入位发生变化时,输出位将发生很大变化。(雪崩效应)

MD族

md4

MD4 由Ron Rivest设计 1990年
具有3轮16步,输出位长度为128位。
特点:对任意长度的输入,产生128位输出;其安全性不依赖任何假设,适合高速实现
MD4公布不久,一些密码学家发现,如果去掉MD4算法的第一轮和最后一轮,则算法是不安全的,但他们并没有证明整个算法是不安全的。

md5

MD5 由Ron Rivest设计 1991年 对MD4的改进
具有4轮16步,输出位长128位。
输入分组 512bit
输出 128bit

SHA系列

SHA系列包括多个散列算法标准,其中, SHA-1是数字签名标准中要求使用的算法。
SHA-0:正式地称作SHA,这个版本在发行后不久被指出存在弱点。
SHA-1:NIST于1994年发布的,它与MD4和MD5散列算法非常相似,被认为是MD4和MD5的后继者。(160位)
SHA-2:实际上分为SHA-224、 SHA-256、SHA-384和SHA512算法。

SHA-1

SHA-1接受任何有限长度的输入消息,并产生长度为160比特的Hash值(MD5仅仅生成128位的摘要),因此抗穷举攻击的能力更强。SHA-1设计原理.与MD4相同,它有5个参与运算的32位寄存器字,消息分组和填充方式与MD5相同,主循环也同样是4轮,但每轮进行20次操作,非线性运算、移位和加法运算也与MD5类似,但非线性函数、加法常数和循环左移操作的设计有一些区别。

SHA-2
  • SHA-256:具有64轮单步,输出位长度为256位。
  • SHA-384:实际上与SHA-512相同,除了输出被截断为383位。
  • SHA-512:具有80个单步的轮数和512位的输出位长度。

消息认证

网络系统安全一般要考虑两个方面:
一方面,加密保护传送的信息,使其可以抵抗被动攻击;
另一方面,就是要能防止对手对系统进行主动攻击,如伪造、篡改信息等。认证是对抗主动攻击的主要手段,它对于开放的网络中的各种信息系统的安全性有重要作用。认证分为实体认证消息认证

在一个开放通信网络的环境中,信息面临的攻击包括窃听、伪造、修改、插入、删除、否认等。因此,需要提供用来验证消息完整性的一种机制或服务–消息认证。这种服务的主要功能包括:

  • 确保收到的消息确实和发送的一样;
  • 确保消息的来源真实有效;

注:对称密码体制和公钥密码体制都可提供这种服务,但用于消息认证的最常见的密码技术是基于哈希函数的消息认证码

消息认证的目的

验证信息的来源是真实的,而不是冒充的,此为消息源认证。
验证消息的完整性,即验证信息在传送或存储过程中是否被修改。

消息认证码

消息认证码(MAC,Messages Authentication Codes),是与密钥相关的的单向散列函数,也称为消息鉴别码或是消息校验和。此时需要通信双方A和B共享一密钥K。
设A欲发送给B的消息是M,A首先计算

M

A

C

=

C

k

(

M

)

MAC=C_k(M)

MAC=Ck​(M),其中

C

k

(

)

C_k(●)

Ck​(●)是密钥控制的公开函数(如哈希函数),然后向B发送M||MAC,B收到后做与A相同的计算,求得一MAC,并与收到的MAC做比较。
HMAC由H.Krawezyk,M.Bellare,R.Canetti于1996年提出的一种基于Hash函数和密钥进行消息认证的方法,并于1997年作为RFC2104被公布,并在IPSec和其他网络协议(如SSL)中得以广泛应用,现在已经成为事实上的Internet安全标准。

认证码与检错码

现代密码学中的消息认证码与通信学的消息检错码有密切的联系,并由其演变而来,但其根源和目的是不同的,采用的技术手段有本质的差别

  • 检错码是检测由于通信的缺陷而导致消息发生错误的方法。(客观环境造成的)
  • 认证码是用来检查由于恶意或有目的等方式修改消息的技术。(人为原因造成的)

HMAC的Go实现

crypto/hmac包

func New(h func() hash.Hash, key []byte) hash.Hash

New函数返回一个采用hash.Hash作为底层hash接口、key作为密钥的HMAC算法的hash接口。

func Equal(mac1, mac2 []byte) bool

比较两个MAC是否相同,而不会泄露对比时间信息。(以规避时间侧信道攻击:指通过计算比较时花费的时间的长短来获取密码的信息,用于密码破解)

hash包

io.Writer

通过嵌入的匿名io.Writer接口的Write方法向hash中添加更多数据,永远不返回错误

Sum(b []byte) []byte

返回添加b到当前的hash值后的新切片,不会改变底层的hash状态

crypto/sha1包

func New() hash.Hash

返回一个新的使用SHA1校验的hash.Hash接口。

代码实现

生成MAC
1.使用hmac.New生成hash.Hash(这里使用的sha1,之后的数字签名文章会使用sha2)
2.使用Hash接口的Write添加原消息
3.使用hash.Sum获取MAC

func GenerateMAC(plainText,key []byte) []byte {
	hash := hmac.New(sha1.New,key)
	hash.Write(plainText)
	hashText := hash.Sum(nil)
	return hashText
}

验证MAC
1.使用hmac.New生成hash.Hash
2.使用Hash接口的Write添加原消息
3.使用hash.Equal验证MAC

func VerifyMAC(plainText,key,hashText []byte) bool {
	hash := hmac.New(sha1.New,key)
	hash.Write(plainText)
	return hmac.Equal(hashText,hash.Sum(nil))
}

全部代码

package main

import (
	"crypto/hmac"
	"crypto/sha1"
	"fmt"
)

// 生成消息认证码
// plainText 明文
// key 密钥
// 返回 消息认证码
func GenerateMAC(plainText,key []byte) []byte {
	hash := hmac.New(sha1.New,key)
	hash.Write(plainText)
	hashText := hash.Sum(nil)
	return hashText
}

// 消息认证
// plainText 明文
// key 密钥
// hashText 消息认证码
// 返回 是否是原消息
func VerifyMAC(plainText,key,hashText []byte) bool {
	hash := hmac.New(sha1.New,key)
	hash.Write(plainText)
	return hmac.Equal(hashText,hash.Sum(nil))
}

func main()  {
	plainText := []byte("消息")
	key := []byte("私钥")
	hashText := GenerateMAC(plainText,key)
	ok := VerifyMAC(plainText,key,hashText)
	if ok{
		fmt.Printf("%s 是原消息\n",plainText)
	}
	fakeText := []byte("假消息")
	ok = VerifyMAC(plainText,key,fakeText)
	if !ok{
		fmt.Printf("%s 是假消息\n",fakeText)
	}
}


截图

在这里插入图片描述
已更新到:gocrypto

参考

《现代密码学教程 谷利泽 杨义先等》
Go标准库-crypto/hmac
Go标准库-hash
Go-标准库-crypto/sha1

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

Utr-1715847710249)]

[外链图片转存中…(img-kJ5oqI7r-1715847710249)]

[外链图片转存中…(img-866OT8xF-1715847710249)]

[外链图片转存中…(img-pz9XCtXq-1715847710250)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值