2023年7月27日发(作者:)
常⽤加密算法学习总结之散列函数(hashfunction)散列函数(Hash function)⼜称散列算法、哈希函数,散列函数把消息或数据压缩成摘要,使得数据量变⼩,将数据的格式固定下来。该函数将数据打乱混合,重新创建⼀个叫做散列值(hash values)的指纹。这种转化是⼀种压缩映射,也就是散列值的空间通常远⼩于输⼊值的空间,不同的输⼊可能会散列成相同的输出,⼆不可能从散列值来唯⼀的确定输⼊值。简单的说就是⼀种将任意长度的消息压缩到某⼀固定长度的消息摘要函数。散列函数性质通过使⽤单向散列函数,即便是确认⼏百MB⼤⼩的⽂件的完整性,也只要对⽐很短的散列值就可以了。那么,单向散列函数必须具备怎样的性质呢?我们来整理⼀下。根据任意长度的消息计算出固定长度的散列值能够快速计算出散列值计算散列值所花费的时间短。尽管消息越长,计算散列值的时间也会越长,但如果不能在现实的时间内完成计算就没有意义了。消息不同散列值也不同难以发现碰撞的性质称为抗碰撞性(collisionresistance)。密码技术中所使⽤的单向散列函数,都需要具备抗碰撞性。强抗碰撞性,是指要找到散列值相同的两条不同的消息是⾮常困难的这⼀性质。在这⾥,散列值可以是任意值。密码技术中的单向散列函数必须具备强抗碰撞性。具备单向性单向散列函数必须具备单向性(one-way)。单向性指的是⽆法通过散列值反算出消息的性质。根据消息计算散列值可以很容易,但这条单⾏路是⽆法反过来⾛的。散列函数的应⽤散列函数应⽤具有多样性安全加密:保护资料,散列值可⽤于唯⼀地识别机密信息。这需要散列函数是抗碰撞(collision-resistant)的,意味着很难找到产⽣相同散列值的资料。如数字签名、消息认证码。数据校验:确保传递真实的信息:消息或数据的接受者确认消息是否被篡改的性质叫数据的真实性,也称为完整性。错误校正:使⽤⼀个散列函数可以很直观的检测出数据在传输时发⽣的错误。负载均衡:通过hash算法,对客户端IP进⾏计算hash值,将取到值与服务器数量进⾏取模运算。分布式存储:如⼀致性hash。常⽤单项散列函数MD4 MD5MD5在1996年后被证实存在弱点,可以被加以破解,对于需要⾼度安全性的资料,专家⼀般建议改⽤其他算法,如SHA-2。2004年,证实MD5算法⽆法防⽌碰撞攻击,因此不适⽤于安全性认证,如SSL公开密钥认证或是数字签名等⽤途。SHA-1 SHA-2SHA-1:1995年发布,SHA-1在许多安全协议中⼴为使⽤,包括TLS、GnuPG、SSH、S/MIME和IPsec,是MD5的后继者。但SHA-1的安全性在2010年以后已经不被⼤多数的加密场景所接受。2017年荷兰密码学研究⼩组CWI和Google正式宣布攻破了SHA-1。SHA-2:2001年发布,包括SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。SHA-2⽬前没有出现明显的弱点。虽然⾄今尚未出现对SHA-2有效的攻击,但它的算法跟SHA-1基本上仍然相似。 ⽐特币使⽤的sha-256进⾏的数字签名算法和变体MD5SHA-0SHA-1SHA-2SHA-384 SHA-512 SHA-512/224 SHA-512/256Go语⾔中使⽤散列函数Go语⾔使⽤MD5⽅式⼀:("123")⽅式2:func getMD5_2(str []byte) string { // 1. 创建⼀个使⽤MD5校验的Hash对象` myHash := () // 2. 通过io操作将数据写⼊hash对象中 tring(myHash, "hello") //tring(myHash, ", world") ([]byte(", world")) // 3. 计算结果 result := (nil) n(result) // 4. 将结果转换为16进制格式字符串 res := f("%x", result) n(res) // --- 这是另外⼀种格式化切⽚的⽅式 res = ToString(result) n(res) return res}Go语⾔SHA-1、SHA-2的使⽤⽅法⼀:512()256()⽅法⼆与md5的使⽤类似输出散列值长度(bits)128160160SHA-224 SHA-256384 512 224 256中继散列值长度(bits)128 (4 × 32)160 (5 × 32)160 (5 × 32)224 256512 (8 × 64)资料区块长度(bits)5 (8 × 32)1024最⼤输⼊消息长度(bits)⽆限264 − 1264 − 15122128 − 1
发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1690460981a352597.html
评论列表(0条)