哈希hash与消息认证码
哈希hash
特点
-
不可逆(原像不可逆)
- 单向的,无法通过哈希值反推会原内容
-
抗碰撞
- 基数极大,无法给定义一个哈希,找到另外的内容,两者哈希值相同。
-
唯一性(算法固定时)
- 内容不变,哈希值不变
- 内容改变,哈希一定改变
使用场景
- 随机口令
- 防止篡改:消息认证码,数字签名
- 密码存储:数据库存储密码的哈希值,而不是原文,保护用户信息
go语言使用哈希算法
方法一
该方法适用于不断地接收新数据,向hasher中追加
md5
//创建一个哈希接口
//这个接口里面实现了io.writer接口, 可以向这个hasher里面写入我们要处理的数据
hasher:=md5.New()
n, _ := io.WriteString(hasher,"hello world")
fmt.Println("n:", n)
hash:=hasher.Sum(nil)
fmt.Printf("%x\n",hash[:])
sha256
//创建一个哈希接口
//这个接口里面实现了io.writer接口, 可以向这个hasher里面写入我们要处理的数据
hasher:=sha256.New()
n, _ :=io.WriteString(hasher,"hello world")
fmt.Println("n:", n)
hash:=hasher.Sum(nil)
fmt.Printf("%x\n",hash[:])
方法二
该方法适用于一次性得到数据
md5
hash:=md5.Sum([]byte("hello world"))
fmt.Printf("%x\n",hash[:])
sha256
hash:=sha256.Sum256([]byte("hello world"))
fmt.Printf("%x\n",hash[:])
消息认证码
消息认证码可以解决的问题
-
消息的完整性(integrity), 指的是“消息没有被篡改”这一性质,完整性也叫一致性
-
消息的认证(authentication)指的是“消息来自正确的发送者”这一性质
。
消息认证码的使用步骤
- 发送者Alice与接收者Bob事先共享密钥。
- 发送者Alice根据汇款请求消息计算MAC值(使用共享密钥)。
- 发送者Alice将汇款请求消息和MAC值两者发送给接收者Bob。
- 接收者Bob根据接收到的汇款请求消息计算MAC值(使用共享密钥)。
- 接收者Bob将自己计算的MAC值与从Alice处收到的MAC值进行对比。
- 如果两个MAC值一致,则接收者Bob就可以断定汇款请求的确来自Alice(认证成功);如果不一致,则可以断定消息不是来自Alice(认证失败)。
使用消息认证码依然会存在的问题
-
秘钥无法有效分发
-
无法防止否认(Ablice 和Bob都有秘钥,所以都可以否认自己发过某个消息)
-
无法进行第三方证明(如果需要别人帮忙认证,那么这个人就需要持有秘钥)
解决问题的方法
使用
数字签名
——非对称加密的数字签名
-
秘钥无法有效分发 ===> 不需要发送私钥
-
无法防止否认(Ablice 和Bob都有秘钥,所以都可以否认自己发过某个消息) ==》私钥只有自己持有,无法否认
-
无法进行第三方证明(如果需要别人帮忙认证,那么这个人就需要持有秘钥) ==》使用公钥就可以帮忙认证,公钥是对外公开的。
版权声明:本文为hbshhb原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。