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 斜杠 等号 问题

相关阅读 >>

Golang判断字符是否存在字符串中

Golang 引用和指针的区别

Go 1.15 版本的优化清单【总结】

Go微服务入门到容器化实践,落地可观测的微服务电商项目

cis 657 nachos system calls for file i/o

Go语言都用什么框架

聊聊dapr的fswatcher

杂七杂八的一些备忘

基于Go语言构建的万亿级流量大数据平台架构|文末彩蛋

Golang 限流器,控制并发,线程池

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




打赏

取消

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

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

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

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

评论

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