首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby与Go / sha256 hmac base64编码字符串不匹配

Ruby与Go / sha256 hmac base64编码字符串不匹配
EN

Stack Overflow用户
提问于 2019-06-12 17:44:38
回答 1查看 673关注 0票数 4

我正在尝试创建一个ruby客户端。

出于安全原因,我需要对url进行签名。

下面是go提供的示例:

代码语言:javascript
复制
package main

import (
    "crypto/hmac"
    "crypto/sha256"
    "encoding/base64"
    "fmt"
)

func main() {
  signKey := "ea79b7fd-287b-4ffe-b941-bf983181783f"
  urlPath := "/resize"
  url := "https%3A%2F%2Fxyz"
  urlQuery := "nocrop=true&type=jpeg&url=" + url + "&width=500"

  h := hmac.New(sha256.New, []byte(signKey))
  h.Write([]byte(urlPath))
  h.Write([]byte(urlQuery))
  buf := h.Sum(nil)
    fmt.Println(base64.RawURLEncoding.EncodeToString(buf)
}

转换为拼音后,我们可以看到:

代码语言:javascript
复制
require 'openssl'
require 'base64'

signKey = "ea79b7fd-287b-4ffe-b941-bf983181783f"
urlPath = "/resize"
url = "https%3A%2F%2Fxyz"
urlQuery = "nocrop=true&type=jpeg&url=" + url + "&width=500"

digest = OpenSSL::Digest.new('sha256')
hmac = OpenSSL::HMAC.digest(digest, signKey, "#{urlPath}#{urlQuery}")
pp Base64.strict_encode64(hmac)

我们就快到了,但是有一个小问题,不知道是openssl还是base64造成的,但例如当我用go得到这个:

wClkWcUvI9ILs7noAr_HtnKpRCeeWBXE1Ne2C99sAco

对于ruby版本,我得到了以下内容:

wClkWcUvI9ILs7noAr/HtnKpRCeeWBXE1Ne2C99sAco=

对于ruby,无论做了什么,它最终都会有一个=

go使用下划线,ruby使用反斜杠(这最后一条语句可能是完全不了解特定ruby部分的结果,但让我们来详细说明这个问题)

应该做什么才能在两个版本中获得相同的输出?为什么我们在这两种语言之间得到了接近但不确切的结果?

非常感谢你的回复

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-12 17:59:17

Go代码使用base64编码的URL安全变体,而Ruby代码使用普通版本。URL安全版本使用-_而不是+/,因此在URL中使用它是安全的。Ruby版本还包括填充(末尾的= )。

您可以使用URL safe version in Ruby,也可以指定无填充以获得与Go相同的结果:

代码语言:javascript
复制
Base64.urlsafe_encode64(hmac, false)
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56559148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档