密码学之Hash散列算法
飞儿506
发表于 2022-12-7 09:57:21
93
0
0
Hash,音译“哈希”,一般翻译做“散列”,就是把任意长度的数据作为输入,然后通过Hash散列算法得到一个固定长度的输出值,该输出值就是散列值,它是一种数据压缩映射关系。 简单来说就是将做任意长度的消息压缩到某一固定长度的消息摘要的函数。* {2 D2 v: @+ \( l0 Y* f! B2 x
例如:& l/ q4 V3 c# `
. Y4 t3 W+ Z/ j, q2 h, S) N% D$ F( H8 n
简单理解代码示例:- Z8 `- h5 {7 w9 n$ |6 J
Hash散列算法特征) [' f2 ?( @* W; U. l8 ]& i
正向快速:给定明文和hash算法,在有限时间和有限资源内计算Hash值。
不可逆性:给定任意的Hash值,在有限时间内很难逆推出明文。
输入敏感:如果输入的数据信息被轻微修改,输出的Hash值也会有很明显的变化。' i5 h! g' {4 A! ^+ N
抗碰撞性:任意输入不同的数据,其输出的Hash值不可能相同,如果给定一个数据块去找出其具有相同的Hash值,那是几乎不可能。2 C$ x, M0 y6 P4 ~8 }- J* n. N
Hash散列算法实现原理
算法实现可以有:加运算,位运算,乘运算,等。。。
它的最大特征就是:将做任意长度的消息压缩到某一固定长度的值。1 O+ C2 H- d3 a6 v) y$ m( W; W
典型散列算法函数5 |9 q7 L" G- [$ _6 v$ f
' c6 j* b* ~! T+ E/ o3 M
如何解决概率散列值生成0-15冲突
采用方法:Map链表 Y3 j1 Z1 W- v. F' ~
) B" b- }9 }" M6 S- k
1.创建一个长度为16的数组,用于存放散列函数运算生成的0到15范围的固定散列值。//创建长度为16数组,用于存放散列运算生成的 0〜15 范围的固定散列值
const ARRAY_LEN int = 16
var buckets = make([]*LNode, ARRAY_LEN)* m0 j1 P# `& |( o% M5 I
2.创建一个链表结构,并实现链表增,删,改,查等方法。
/**
存放数据元素结构- V( t+ S0 {$ Z# \, G0 H5 u
*/
type KValue struct {( r1 v6 I) d1 k4 n# N
Key string( N9 t; E9 P! e+ ?
Value string: p. w9 X" }4 n2 y$ D3 f
}5 `( ?: Z$ V: h4 I) E F
/**
节点结构
*/! I. _: |) y% D3 L8 q
type LNode struct {# Z' O0 C, e5 [1 @
Data KValue
NextNode *LNode;
}
3.初始化数组,每个数组元素默认创建一个链表头,通过链表来存放数据来解决散列运算中生成的0~15范围的冲突问题,比如输出两个者是5的散列值时,这时候就把这两个的数据存放到对应数组元素为5的链表结构上。
func InitBuckets() {1 [ ], M( W- b- j) v. a+ X8 U; F
for i:=0; i6 I5 Q; a# l w
4.添加新数据。
/**$ |- y! v4 N8 p# b* p, y2 u
添加用户新值,供外部调用
*/6 u4 |1 O" c; O0 l6 |
func AddKeyValue(key string, value string) {
//散列算法生成 0~15 值* G9 S* h/ U7 \) G
hashIndex := HashCode(key);
' l# r& h5 ]) R
//获取数组对应的链表头节点
var headNote = buckets[hashIndex]
//先找出尾节点以确保在尾结点上添加节点
var tailNode = TailNode(headNote)
//添置新结点
AddNewNode(KValue{key,value}, tailNode);% k. Q1 v0 [9 C3 T4 u
//显示当前链表中所有节点3 v- V- B/ f2 h% t
ShowAllNode(headNote)2 ~+ N1 B! ?8 S4 |7 \ e: j6 H% x
}
Hash算法区块链上应用/ S: r; F5 Y7 F* N! X
应用于区块的生成、验证及交易的完整性
$ y0 I3 U- d! J# Q
从区块链的架构可以看出区块链其实就是一个特定数据库结构,由若干个有序的区块通过相互间的哈希(Hash)值连接在一起的链表结构。它也是一个典型的哈希指针链表,每一个区块的 prev_block_hash 都指向上一个区块的哈希,每个区块信息都可通过任意一个区块哈希去查找,具有可塑性。如图为区块链结构。4 l' i9 J+ q9 v
' }" N$ ~# v- m% }# F3 G* Y4 B! f* G
PoW共识机制的实现,通过计算一个区块的目标Hash散列值进行大量的穷举运算。具体原理实现请翻读之前发表的文章。# O) W; f f5 W
区块中Merkle树生成根结点的实现,通过对叶子节点从底层开始往上两两做SHA256 Hash,直到得出最顶部的节点Hash值作为本区块树的交易Hash,并将它存放在区块链上。
) O8 i+ B' b! V, B# E
钱包地址的生成,对公钥进行两次SHA256 Hash。
1 v& r9 {; ^$ N
结语% B) M' J" R! P
本篇主要讲了密码学的其中一种加密算法-Hash散列算法,文章主要讲了Hash散列算法的概念、特征、以及它的运行原理,另外也讲了Hash算法在区块链上的一些应用。密码学在区块链系统中起着举足轻重的作用,没有密码学技术的加入,那区块链系统就变成是一个很普通的分布式日志系统。
成为第一个吐槽的人