哈希hash与消息认证码

  • Post author:
  • Post category:其他




哈希hash与消息认证码



哈希hash



特点

  1. 不可逆(原像不可逆)

    1. 单向的,无法通过哈希值反推会原内容
  2. 抗碰撞

    1. 基数极大,无法给定义一个哈希,找到另外的内容,两者哈希值相同。
  3. 唯一性(算法固定时)

    1. 内容不变,哈希值不变
    2. 内容改变,哈希一定改变



使用场景

  1. 随机口令
  2. 防止篡改:消息认证码,数字签名
  3. 密码存储:数据库存储密码的哈希值,而不是原文,保护用户信息



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)指的是“消息来自正确的发送者”这一性质



消息认证码的使用步骤

在这里插入图片描述

  1. 发送者Alice与接收者Bob事先共享密钥。
  2. 发送者Alice根据汇款请求消息计算MAC值(使用共享密钥)。
  3. 发送者Alice将汇款请求消息和MAC值两者发送给接收者Bob。
  4. 接收者Bob根据接收到的汇款请求消息计算MAC值(使用共享密钥)。
  5. 接收者Bob将自己计算的MAC值与从Alice处收到的MAC值进行对比。
  6. 如果两个MAC值一致,则接收者Bob就可以断定汇款请求的确来自Alice(认证成功);如果不一致,则可以断定消息不是来自Alice(认证失败)。



使用消息认证码依然会存在的问题

  1. 秘钥无法有效分发

  2. 无法防止否认(Ablice 和Bob都有秘钥,所以都可以否认自己发过某个消息)

  3. 无法进行第三方证明(如果需要别人帮忙认证,那么这个人就需要持有秘钥)



解决问题的方法

使用

数字签名

——非对称加密的数字签名

  1. 秘钥无法有效分发 ===> 不需要发送私钥

  2. 无法防止否认(Ablice 和Bob都有秘钥,所以都可以否认自己发过某个消息) ==》私钥只有自己持有,无法否认

  3. 无法进行第三方证明(如果需要别人帮忙认证,那么这个人就需要持有秘钥) ==》使用公钥就可以帮忙认证,公钥是对外公开的。



版权声明:本文为hbshhb原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。