230-go语言中使用HMAC
时间:2019-01-17
本文章向大家介绍230-go语言中使用HMAC,主要包括230-go语言中使用HMAC使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
go语言中使用HMAC
我们先说一下
要使用的两个函数
第一个
hmac.New函数
func New(h func() hash.Hash, key []byte) hash.Hash
我们来看下源码
// New returns a new HMAC hash using the given hash.Hash type and key.
// Note that unlike other hash implementations in the standard library,
// the returned Hash does not implement encoding.BinaryMarshaler
// or encoding.BinaryUnmarshaler.
func New(h func() hash.Hash, key []byte) hash.Hash {
hm := new(hmac)
hm.outer = h()
hm.inner = h()
hm.size = hm.inner.Size()
hm.blocksize = hm.inner.BlockSize()
hm.ipad = make([]byte, hm.blocksize)
hm.opad = make([]byte, hm.blocksize)
if len(key) > hm.blocksize {
// If key is too big, hash it.
hm.outer.Write(key)
key = hm.outer.Sum(nil)
}
copy(hm.ipad, key)
copy(hm.opad, key)
for i := range hm.ipad {
hm.ipad[i] ^= 0x36
}
for i := range hm.opad {
hm.opad[i] ^= 0x5c
}
hm.inner.Write(hm.ipad)
return hm
}
翻译一下
通过传入的hash和key,返回一个HMAC的hash接口,
注意:这个返回的hash接口和标准库的不一样
这个hash接口不实现
encoding.BinaryMarshaler 和 encoding.BinaryUnmarshaler
然后我们看下参数
参数1: 创建⼀个新的使⽤哈希校验算法的hash.Hash接⼝, 如:
md5.New()
sha1.New()
sha256.New()
参数2: 使⽤的秘钥
返回值: 通过该哈希接⼝添加数据和计算消息认证码
添加数据: Write(p []byte) (n int, err error)
计算结果: Sum(b []byte) []byte
第二个
hmac.Equal方法
func Equal(mac1, mac2 []byte) bool
我们看下源码
func Equal(mac1, mac2 []byte) bool {
// We don't have to be constant time if the lengths of the MACs are
// different as that suggests that a completely different hash function
// was used.
return subtle.ConstantTimeCompare(mac1, mac2) == 1
}
这个方法很简单
就是比较一下两个mac值
现在我们来点代码
func main() {
text := "你好 世界 hello world"
key := "abcabc123123"
HMAC := GenerateHMAC(text, key)
fmt.Println(HMAC)
}
func GenerateHMAC(text string, key string) string {
textBytes := []byte(text)
keyBytes := []byte(key)
hash := hmac.New(sha256.New, keyBytes)
hash.Write(textBytes)
result := hash.Sum(nil)
return string(result)
}
很简单吧
然后我们验证一下生成的HMAC
func main() {
text := "你好 世界 hello world"
key := "abcabc123123"
HMAC := GenerateHMAC(text, key)
fmt.Println(HMAC)
verifyHMAC := VerifyHMAC(HMAC, text, key)
fmt.Println(verifyHMAC)
}
func VerifyHMAC(HMAC string, text string, key string) bool {
HMACBytes := []byte(HMAC)
nowHMAC := GenerateHMAC(text, key)
nowHMACBytes := []byte(nowHMAC)
return hmac.Equal(HMACBytes, nowHMACBytes)
}
func GenerateHMAC(text string, key string) string {
textBytes := []byte(text)
keyBytes := []byte(key)
hash := hmac.New(sha256.New, keyBytes)
hash.Write(textBytes)
result := hash.Sum(nil)
return string(result)
}
- 为WordPress开启Nginx缩略图功能,七牛从此陌路
- 为网站开启Nginx缓存加速,支持html伪静态页面
- 解决WordPress升级4.2后调用国外图片导致大量404请求的问题
- JS代码实现浏览器网页标题的动态切换,略微提高网站粘性
- Go-List
- 分享张戈博客自用的php网址在线转换二维码的API源码
- zabbix agentd客户端插件Shell一键自动安装脚本
- SendCloud邮件队列状态和已使用额度的Python监控脚本
- linux/scp命令报“bash: scp: command not found lost connection”错误的解决办法
- bat/cmd批处理连接SqlServer数据库查询脚本
- 一起用 HTML5 Canvas 做一个简单又骚气的粒子引擎
- 解决mstsc无法连接问题:由于没有远程桌面授权服务器可以提供许可证…
- Apache/Nginx伪静态规则匹配http://出现的问题与解决
- 微信文件微起底
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- dotnet 执行 docker 容器 error MSB4018 CreateAppHost 任务意外失败可能原因
- dotnet 定制 ILogger 实现
- dotnet 在 UOS 国产系统上安装 Mono 开发工具的方法
- dotnet 在 Linux 下的 GDI 库对 EMF 图片格式的支持
- 跟牛老师一起学WEBGIS——WEBGIS基础(WMS服务)
- 【STM32H7】第6章 RL-TCPnet V7.X底层驱动说明
- 【STM32F429】第6章 RL-TCPnet V7.X底层驱动说明
- 【STM32F407】第6章 RL-TCPnet V7.X底层驱动说明
- LINUX一些面试问题集合
- 【redis6.0.6】redis源码慢慢学,慢慢看 -- 第二天:空间配置(zmalloc)
- URI格式
- 讲通C/C++预编译/条件编译指令 #ifdef,#ifndef,#endif,#define,…
- FreeRTOS静态和动态创建任务
- Jenkins部署Springboot项目
- atoi函数