消息认证码

go消息认证码的使用

有一个包: crypto/hmac

> func New(h func() hash.Hash, key []byte) hash.Hash
> - 返回值: hash接口
> - 参数1: 函数函数的函数名
>    sha1.new
>    md5.new
>    sha256.new
> - 参数2: 秘钥
>
> 第二步: 添加数据
> type Hash interface {
>     // 通过嵌入的匿名io.Writer接口的Write方法向hash中添加更多数据,永远不返回错误
>     io.Writer
>     // 返回添加b到当前的hash值后的新切片,不会改变底层的hash状态
>     Sum(b []byte) []byte
>     // 重设hash为无数据输入的状态
>     Reset()
>     // 返回Sum会返回的切片的长度
>     Size() int
>     // 返回hash底层的块大小;Write方法可以接受任何大小的数据,
>     // 但提供的数据是块大小的倍数时效率更高
>     BlockSize() int
> }
> type Writer interface {
>     Write(p []byte) (n int, err error)
> }
> 第三步: 计算散列值

使用步骤

  1. 前提条件:

    • 在消息认证码生成的一方和校验的一方, 必须有一个秘钥
    • 双方约定好使用同样的哈希函数对数据进行运算
  2. 流程:
    • 发送者:

      • 发送原始法消息
      • 将原始消息生成消息认证码
        • ((原始消息) + 秘钥) * 函数函数 = 散列值(消息认证码)
      • 将消息认证码发送给对方
    • 接收者:
      • 接收原始数据
      • 接收消息认证码
      • 校验:
        • ( 接收的消息 + 秘钥 ) * 哈希函数 = 新的散列值
        • 通过新的散列值和接收的散列值进行比较
// 生成消息认证码
func GenerateHamc(plainText, key []byte)[]byte {// 1.创建哈希接口, 需要指定使用的哈希算法, 和秘钥myhash := hmac.New(sha1.New, key)// 2. 给哈希对象添加数据myhash.Write(plainText)// 3. 计算散列值hashText := myhash.Sum(nil)return hashText
}// 验证消息认证码
func VerifyHamc(plainText, key, hashText []byte) bool {// 1.创建哈希接口, 需要指定使用的哈希算法, 和秘钥myhash := hmac.New(sha1.New, key)// 2. 给哈希对象添加数据myhash.Write(plainText)// 3. 计算散列值hamc1 := myhash.Sum(nil)// 4. 两个散列值比较return hmac.Equal(hashText, hamc1)
}func main () {src := []byte("在消息认证码中,需要发送者和接收者之间共享密钥,而这个密钥不能被主动攻击者Mallory获取。" +"如果这个密钥落入Mallory手中,则Mallory也可以计算出MAC值,从而就能够自由地进行篡改和伪装攻击," +"这样一来消息认证码就无法发挥作用了。")key := []byte("helloworld")hamc1 := GenerateHamc(src, key)bl := VerifyHamc(src, key, hamc1)//fmt.Printf("校验结果: %t\n", bl)fmt.Println(bl)
}

消息认证码的问题

  1. 弊端

    • 有秘钥分发困难的问题
  2. 无法解决的问题
    • 不能进行第三方证明
    • 不能防止否认

golang中的消息认证相关推荐

  1. Golang中AK/SK认证的实现

    Golang实现AK/SK认证 一.AK/SK概述 1. 什么是AKSK 2. AK/SK认证过程 二.AK/SK认证例子 1. 设计ak/sk的请求参数 2. 数据库中保存sk 3. 客户端生成签名 ...

  2. 密码技术--消息认证码及go语言应用

    1.什么是消息认证码 消息认证码(message authorization code)是一种确认完整性并进行认证的技术,取了三个单词的首字母,简称为MAC 发送者:((原始数据) + 秘钥) * 哈 ...

  3. 消息认证码和单向散列函数

    因为在上一部分没有解释这两个概念,所以在这里详细解释一下 消息验证码和单向散列函数是进行消息身份验证的两个方法 而且他俩都属于"没有消息加密的消息身份验证" 消息认证码(MAC) ...

  4. JAVA加密解密之消息认证码算法(Message Authentication Code,MAC)

    消息认证码算法简介 在密码学中,消息认证码(英语:Message authentication code,缩写为MAC),又译为消息鉴别码.文件消息认证码.讯息鉴别码.信息认证码,是经过特定算法后产生 ...

  5. Go-哈希函数与消息认证详解(含代码)

    目录 哈希函数 简介 历史 特性 安全性 MD族 md4 md5 SHA系列 SHA-1 SHA-2 消息认证 消息认证的目的 消息认证码 认证码与检错码 HMAC的Go实现 crypto/hmac包 ...

  6. 基于Hash的消息认证码HMAC简介及在OpenSSL中使用举例

    HMAC(Hash-based Message Authentication Code):基于Hash的消息认证码,是一种通过特别计算方式之后产生的消息认证码(MAC),使用密码散列函数,同时结合一个 ...

  7. 微信开发者和其他服务器区别,求教微信公众号开发中两种认证技术的区别?

    本人对微信开发中2个认证方式有些不解,求各位大佬给解释一番. 众所周知,在微信开发者进行开发时,有两个角色和两个场景存在,我分别描述如下: 第一个场景:微信服务器------>我的服务器. 在我 ...

  8. golang中的数字签名

    数字签名 数字签名的方法 签名的生成和验证 签名 有原始数据对其进行哈希运算 -> 散列值 使用非对称加密的私钥对散列值加密 -> 签名 将原始数据和签名一并发送给对方 验证 接收数据 原 ...

  9. OSSIM中分布式消息队列应用

     OSSIM中分布式消息队列应用 1. 消息队列处理 企业日志数量正在以指数级形式高速增长,日志数据的具有海量.多样.异构等特点,基于传统的单一节点混合式安装的OSSIM平台(指OSSIM 4.4及以 ...

最新文章

  1. linux中使用u盘和光驱的命令_Linux操作系统下挂载硬盘光驱和U盘的方法
  2. ArcGIS Engine10.4版本
  3. 使用python进行数据清洗常用的库_python3常用的数据清洗方法(小结)
  4. Delphi中如何将一个extended型等实数强制转换为integer型
  5. 她偏爱雏菊一样的淡黄色_为什么开源项目(非常)偏爱新用户,以及您可以采取什么措施...
  6. LeetCode OJ:Combination Sum III(组合之和III)
  7. 爬虫—Requests高级用法
  8. 文件对比工具比较会话时查看字节地址的方法
  9. 【java笔记】hello world入门程序
  10. BCrypt加密怎么存入数据库_松哥手把手带你入门 Spring Security,别再问密码怎么解密了...
  11. html当前行突出显示,Pandas Dataframes to_html:突出显示表行
  12. 《MYSQL必知必会》—18.如何使用MySQL的Match()和Against()函数进行全文本搜索以及查询扩展的使用
  13. Bluebird-Collections
  14. maven命令-P 参数引发的思考
  15. HTML网页设计原理是什么,HTML+CSS网页设计详解
  16. 资深Java面试题及答案(汇总)
  17. ubuntu 双网卡内外网优先级设置
  18. 环境影响评价知识点整理
  19. dell R740secure boot_凯诺 10月13日 DELL 电脑报价
  20. 行列式的六条运算法则整理

热门文章

  1. 【CMake】CMake 引入 ( Android Studio 创建 Native C++ 工程 | C/C++ 源码编译过程 | Makefile 工具 | CMake 引入 )
  2. 【计算机网络】物理层 : 调制 ( 数字数据 调制 模拟信号 | 调幅 | 调频 | 调相 | 调幅 + 调相 QAM | 计算示例 | 模拟信号 调制为 模拟信号 )
  3. 【Kotlin】抽象类 ( 声明 | 抽象类成员 | 抽象类继承 | 抽象方法覆盖 | 抽象方法实现 )
  4. python基本数据类型及操作
  5. WordCount单词计数
  6. 神在夏至祭降下了神谕(oracle)
  7. windows下pycharm远程调试pyspark
  8. 【bzoj4916】神犇和蒟蒻 杜教筛
  9. 最小生成树之克鲁斯卡尔(Kruskal)算法
  10. 轉:showModalDialog和showModelessDialog使用心得