golang base64 斜杠 等号 问题


本文摘自网络,作者,侵删。

背景

写一个接口认证的时候,密码需要通过SHA1+HMAC加密以后转base64,发现加密的结果不符合预期

问题

shell里面通过命令生成的字符串 golang生产的结果有差别
具体的说,shell 生产的base64传里面有'/',对应golang生产的是'_',例如下面案例

shell输出: NaY6swRy/2BgUPuVUAWEDlaWZ3s=
golang输出:NaY6swRy_2BgUPuVUAWEDlaWZ3s=

原因

  • golang base64 有不同方法进行encode/decode,可以根据不同RFC进行处理,参考链接
  • 为了避免base64出现的 '/' '+' 影响到encode以后的使用(例如拿encode以后的字符串做文件名),RFC 特定制定了一套URL and filename-safe标准,把这两个字符串改成'_' '-', 这次就是掉了这个坑,参考链接
  • 扩展阅读,查这个问题的时候,看到有其他小伙伴因为base64最后没有 '=' 出现报错的,golang里有 WithPadding 函数能搞定

具体代码

#shell, 希望的解析结果
date='Wed, 31 Mar 2021 08:56:15 GMT'
pass='123456'
password=`echo -en "$date" | openssl dgst -sha1 -hmac ${pass} -binary | openssl enc -base64`
echo $password
输出: NaY6swRy/2BgUPuVUAWEDlaWZ3s=
//golang 不符合预期的情况
key := []byte("123456")
mac := hmac.New(sha1.New, key)
mac.Write([]byte("Wed, 31 Mar 2021 08:56:15 GMT"))
// 这里用的URLEncoding,就是按 RFC4648 section5 规则
fmt.Println(base64.URLEncoding.EncodeToString(mac.Sum(nil)))
输出: NaY6swRy_2BgUPuVUAWEDlaWZ3s=
// 换成 StdEncoding 就可以了,按RFC4648 section4 规则
fmt.Println(base64.StdEncoding.EncodeToString(mac.Sum(nil)))

本文来自:简书

感谢作者:TedCat

查看原文:golang base64 斜杠 等号 问题

相关阅读 >>

Go bool

手撸Golang etcd raft协议之10

手撸Golang Go与微服务 saga模式之6

Go log

redis 实战 —— 01. redis 数据结构简介

Golang中的map是指针吗

手撸Golang 基本数据结构与算法 冒泡排序

Gox语言中的全局变量与局部变量-gx52

now-Go时间百宝箱

解决Golang中vendor引起的相同类型,却提示类型不一样问题

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...