我正在尝试创建一个ruby客户端。
出于安全原因,我需要对url进行签名。
下面是go提供的示例:
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)
}转换为拼音后,我们可以看到:
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部分的结果,但让我们来详细说明这个问题)
应该做什么才能在两个版本中获得相同的输出?为什么我们在这两种语言之间得到了接近但不确切的结果?
非常感谢你的回复
发布于 2019-06-12 17:59:17
Go代码使用base64编码的URL安全变体,而Ruby代码使用普通版本。URL安全版本使用-和_而不是+和/,因此在URL中使用它是安全的。Ruby版本还包括填充(末尾的= )。
您可以使用URL safe version in Ruby,也可以指定无填充以获得与Go相同的结果:
Base64.urlsafe_encode64(hmac, false)https://stackoverflow.com/questions/56559148
复制相似问题