golang base64 斜杠 等号 问题

TedCat · · 975 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

背景

写一个接口认证的时候,密码需要通过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大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

975 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传