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

学习路线:

这个方向初期比较容易入门一些,掌握一些基本技术,拿起各种现成的工具就可以开黑了。不过,要想从脚本小子变成黑客大神,这个方向越往后,需要学习和掌握的东西就会越来越多以下是网络渗透需要学习的内容:
在这里插入图片描述

需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

哈希函数也称散列函数、杂凑函数等,是一种单向密码体制,即它是一个从明文到密文的不可逆映射,即只有“加密”过程,不存在“解密”过程。同时,Hash函数可以将“任意”长度的输入经过变换以后得到固定长度的输出。Hash函数的这种单向特征和输出数据长度固定的特征使得它可以生成消息或数据块的“数据指纹”(也称消息摘要、哈希值或散列值),因此,哈希函数在数据完整性和数字签名等领域有广泛的应用。
使用公式表示为:

h

=

H

(

m

)

h=H(m)

h=H(m)

  • M:任意长度的消息
  • H:哈希(Hash)函数或杂凑函数或散列函数
  • h:固定长度的哈希值

历史

Hash的概念起源于1956年,Dumey用它来解决symbol table question(符号表问题), 使得数据表的插入、删除、查询操作可以在更短的时间内完成。
散列算法MD族是在上个世纪90年代初由Ron●Rivest设计的,MD代表消息摘要(message-digest), MD2(1989)、MD4(1990)和MD5(1991)都产生一个128位的信息摘要。
SHA系列算法是美国国家标准与技术研究院(NIST)根据Rivest设计的MD4和MD5而开发的算法,国家安全当局发布SHA作为美国政府标准,SHA(Secure Hash Algorithm)表示安全散列算法。

特性

  • 输入:消息是任意有限长度。
  • 输出:哈希值是固定长度。
  • 容易计算:对于任意给定的消息,容易计算其哈希值(正向容易)。
  • 单向性:对于给定的哈希值h,要找到M使得H(M)=h在计算上是不可行的。(逆向不可行)

安全性

  • 抗弱碰撞性:对于给定的消息M,要发现另一个消息M2,满足

H

(

M

1

)

=

H

(

M

2

)

H(M_1)=H(M_2)

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

  • 抗强碰撞性:找任意一对不同的消息M, M2,使

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接口。

代码实现

本人从事网路安全工作12年,曾在2个大厂工作过,安全服务、售后服务、售前、攻防比赛、安全讲师、销售经理等职位都做过,对这个行业了解比较全面。

最近遍览了各种网络安全类的文章,内容参差不齐,其中不伐有大佬倾力教学,也有各种不良机构浑水摸鱼,在收到几条私信,发现大家对一套完整的系统的网络安全从学习路线到学习资料,甚至是工具有着不小的需求。

最后,我将这部分内容融会贯通成了一套282G的网络安全资料包,所有类目条理清晰,知识点层层递进,需要的小伙伴可以点击下方小卡片领取哦!下面就开始进入正题,如何从一个萌新一步一步进入网络安全行业。

需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)

学习路线图

其中最为瞩目也是最为基础的就是网络安全学习路线图,这里我给大家分享一份打磨了3个月,已经更新到4.0版本的网络安全学习路线图。

相比起繁琐的文字,还是生动的视频教程更加适合零基础的同学们学习,这里也是整理了一份与上述学习路线一一对应的网络安全视频教程。

网络安全工具箱

当然,当你入门之后,仅仅是视频教程已经不能满足你的需求了,你肯定需要学习各种工具的使用以及大量的实战项目,这里也分享一份我自己整理的网络安全入门工具以及使用教程和实战。

项目实战

最后就是项目实战,这里带来的是SRC资料&HW资料,毕竟实战是检验真理的唯一标准嘛~

面试题

归根结底,我们的最终目的都是为了就业,所以这份结合了多位朋友的亲身经验打磨的面试题合集你绝对不能错过!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C语言中,可以通过使用二维数组来实现哈希函数。具体实现方法如下: 1. 首先,定义一个二维数组作为哈希表,数组的每个元素表示一个哈希桶,每个哈希桶可以存放多个键值对。数组的大小可以根据需要进行调整。 ```c #define MAX_SIZE 10 typedef struct { int key; int value; } Entry; Entry hashTable[MAX_SIZE][MAX_SIZE]; ``` 2. 然后,编写哈希函数来计算键值对应的哈希桶的位置。常用的哈希函数有很多种,比如直接定址法、除留余数法、平方取中法等。根据具体情况选择合适的哈希函数。 ```c int hashFunction(int key) { // 这里使用除留余数法作为哈希函数 return key % MAX_SIZE; } ``` 3. 接下来,可以编写插入和查找函数来操作哈希表。 ```c void insert(int key, int value) { int index = hashFunction(key); // 在对应的哈希桶中查找是否已经存在相同的key,如果存在,更新value;如果不存在,将键值对插入到哈希桶中 int i; for (i = 0; i < MAX_SIZE; i++) { if (hashTable[index][i].key == key) { hashTable[index][i].value = value; return; } if (hashTable[index][i].key == 0) { hashTable[index][i].key = key; hashTable[index][i].value = value; return; } } // 如果哈希桶已满,无法插入键值对 printf("Hash table is full.\n"); } int search(int key) { int index = hashFunction(key); // 在对应的哈希桶中查找key,并返回对应的value int i; for (i = 0; i < MAX_SIZE; i++) { if (hashTable[index][i].key == key) { return hashTable[index][i].value; } } // 如果未找到对应的key,返回一个特定的值表示未找到 return -1; } ``` 通过以上方法,可以实现一个简单的哈希函数和哈希表的功能。在使用哈希函数时,需要根据实际情况选择合适的哈希函数和哈希表大小,以确保哈希函数的性能和哈希表的存储能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C语言-一维数组和二维数组,包括动态一维数组和二维数组声明和使用](https://blog.csdn.net/u012582648/article/details/107912735)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [哈希(Hash)查找算法详解之C语言版](https://blog.csdn.net/sunnyoldman001/article/details/127345993)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值