go语言哈希算法 哈希算法流程图

go.sum工作机制为go语言哈希算法了确保一致性构建,Go引入了go.mod文件来标记每个依赖包的版本,在构建过程中go命令会下载go.mod中的依赖包,下载的依赖包会缓存在本地,以便下次构建 。考虑到下载的依赖包有可能是被黑客恶意篡改的,以及缓存在本地的依赖包也有被篡改的可能,单单一个go.mod文件并不能保证一致性构建 。
为了解决Go module的这一安全隐患,Go开发团队在引入go.mod的同时也引入了go.sum文件,用于记录每个依赖包的哈希值,在构建时,如果本地的依赖包hash值与go.sum文件中记录得不一致,则会拒绝构建 。
go.sum文件记录
【go语言哈希算法 哈希算法流程图】go.sum文件中每行记录由module名、版本和哈希组成 , 并由空格分开go语言哈希算法:
比如,某个go.sum文件中记录了github.com/google/uuid 这个依赖包的v1.1.2版本的哈希值:
正常情况下,每个依赖包版本会包含两条记录,第一条记录为该依赖包版本整体(所有文件)的哈希值,第二条记录表示该依赖包版本中go.mod文件的哈希值,如果该依赖包版本没有go.mod文件,则只有第一条记录 。如上面的例子中,v1.1.2表示该依赖包版本整体,而v1.1.2/go.mod表示该依赖包版本中go.mod文件 。
依赖包版本中任何一个文件(包括go.mod)改动 , 都会改变其整体哈希值,此处再额外记录依赖包版本的go.mod文件主要用于计算依赖树时不必下载完整的依赖包版本,只根据go.mod即可计算依赖树 。
每条记录中的哈希值前均有一个表示哈希算法的h1: , 表示后面的哈希值是由算法SHA-256计算出来的
go.sum文件中记录的依赖包版本数量往往比go.mod文件中要多,这是因为二者记录的粒度不同导致的 。go.mod只需要记录直接依赖的依赖包版本 , 只在依赖包版本不包含go.mod文件时候才会记录间接依赖包版本,而go.sum则是要记录构建用到的所有依赖包版本 。
生成
当go语言哈希算法我们在GOMODULE模式下引入一个新的依赖时 , 通常会使用go get命令获取该依赖,比如:
go get命令首先会将该依赖包下载到本地缓存目录$GOPATH/pkg/mod/cache/download,该依赖包为一个后缀为.zip的压缩包,如v1.0.0.zip 。go get下载完成后会对该.zip包做哈希运算,并将结果存放在后缀为.ziphash的文件中,如v1.0.0.ziphash 。如果在项目的根目录中执行go get命令的话,go get会同步更新go.mod和go.sum文件,go.mod中记录的是依赖名及其版本,如:
go.sum文件中则会记录依赖包的哈希值(同时还有依赖包中go.mod的哈希值),如:
在更新go.sum之前,为了确保下载的依赖包是真实可靠的,go命令在下载完依赖包后还会查询GOSUMDB环境变量所指示的服务器,以得到一个权威的依赖包版本哈希值 。如果go命令计算出的依赖包版本哈希值与GOSUMDB服务器给出的哈希值不一致,go命令将拒绝向下执行,也不会更新go.sum文件 。
go.sum存在的意义在于 , 希望别人或者在别的环境中构建当前项目时所使用依赖包跟go.sum中记录的是完全一致的,从而达到一致构建的目的 。
校验
假设我们拿到某项目的源代码并尝试在本地构建,go命令会从本地缓存中查找所有go.mod中记录的依赖包,并计算本地依赖包的哈希值,然后与go.sum中的记录进行对比 , 即检测本地缓存中使用的依赖包版本是否满足项目go.sum文件的期望 。
如果校验失败,说明本地缓存目录中依赖包版本的哈希值和项目中go.sum中记录的哈希值不一致,go命令将拒绝构建 。这就是go.sum存在的意义,即如果不使用期望的版本,就不能构建 。
校验和数据库
环境变量GOSUMDB标识一个checksum database,即校验和数据库 , 实际上是一个web服务器,该服务器提供查询依赖包版本哈希值的服务 。
该数据库中记录了很多依赖包版本的哈希值,比如Google官方的sum.golang.org则记录了所有的可公开获得的依赖包版本 。除了使用官方的数据库,还可以指定自行搭建的数据库,甚至干脆禁用它(export GOSUMDB=off) 。
如果系统配置了GOSUMDB,在依赖包版本被写入go.sum之前会向该数据库查询该依赖包版本的哈希值进行二次校验,校验无误后再写入go.sum 。
如果系统禁用了GOSUMDB,在依赖包版本被写入go.sum之前则不会进行二次校验 , go命令会相信所有下载到的依赖包,并把其哈希值记录到go.sum中 。
什么是哈希算法,公式是什么哈希算法将任意长度go语言哈希算法的二进制值映射为固定长度的较小二进制值 , 这个小的二进制值称为哈希值 。哈希值是一段数据唯一且极其紧凑的数值表示形式 。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值 。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性 。哈希表是根据设定的哈希函数H(key)和处理冲突方法将一组关键字映象到一个有限的地址区间上,并以关键字在地址区间中的象作为记录在表中的存储位置 , 这种表称为哈希表或散列,所得存储位置称为哈希地址或散列地址 。作为线性数据结构与表格和队列等相比,哈希表无疑是查找速度比较快的一种 。通过将单向数学函数(有时称为“哈希算法”)应用到任意数量的数据所得到的固定大小的结果 。如果输入数据中有变化 , 则哈希也会发生变化 。哈希可用于许多操作,包括身份验证和数字签名 。也称为“消息摘要” 。小红和小明可按下面的方式使用哈希函数以确保数据完整性: 如果小红对小明编写一条消息并创建该消息的哈希,则小明可以在稍后散列该消息并将他的哈希与原始哈希进行比较 。如果两个哈希值相同 , 则该消息没有被更改go语言哈希算法;但是,如果值不相同,则该消息在小红编写它之后已被更改 。为go语言哈希算法了使此系统运行 , 小红必须对除小明外的所有人保密原始的哈希值 。
哈希算法是什么呢?哈希算法就是一种特殊的函数,不论输入多长的一串字符,只要通过这个函数都可以得到一个固定长度的输出值,这就好像身份证号码一样,永远都是十八位而且全国唯一 。哈希算法的输出值就叫做哈希值 。
原理:
哈希算法有三个特点,它们赋予了区块链不可篡改、匿名等特性,并保证了整个区块链体系的完整 。
第一个特点是具有单向性 。比如输入一串数据,通过哈希算法可以获得一个哈希值 , 但是通过这个哈希值是没有办法反推回来得到输入的那串数据的 。这就是单向性,也正是基于这一点,区块链才有效保护了我们信息的安全性 。
哈希算法的第二个特点是抗篡改能力,对于任意一个输入 , 哪怕是很小的改动,其哈希值的变化也会非常大 。
它的这个特性,在区块与区块的连接中就起到了关键性的作用 。区块链的每个区块都会以上一个区块的哈希值作为标示,除非有人能够破解整条链上的所有哈希值,否则数据一旦记录在链上 , 就不可能进行篡改 。
哈希算法的第三个特点就是抗碰撞能力 。所谓碰撞,就是输入两个不同的数据,最后得到了一个相同的输入 。
就跟我们逛街时撞衫一样,而坑碰撞就是大部分的输入都能得到一个独一无二的输出 。在区块链的世界中 , 任何一笔交易或者账户的地址都是完全依托于哈希算法生产的 。这也就保证了交易或者账户地址在区块链网络中的唯一性 。
无论这笔转账转了多少钱,转给了多少个人,在区块链这个大账本中都是唯一的存在 。它就像人体体内的白细胞,不仅区块链的每个部分都离不开它,而且它还赋予了区块链种种特点,保护着整个区块链体系的安全 。
go语言哈希算法的介绍就聊到这里吧 , 感谢你花时间阅读本站内容 , 更多关于哈希算法流程图、go语言哈希算法的信息别忘了在本站进行查找喔 。

    推荐阅读