gpt4 book ai didi

ruby - 无法使用 HMAC 在 Ruby 中生成正确的加密 key

转载 作者:行者123 更新时间:2023-12-03 03:14:57 24 4
gpt4 key购买 nike

我正在尝试遵循 Access Control 的文档并询问类似 azure-documentdb-node SDK 的代码而我却做不到。

我收到以下错误:401 Unauthorized: {"code":"Unauthorized","message":"输入授权 token 无法满足请求。请检查是否按照协议(protocol)构建了预期的有效负载,并检查正在使用的 key 。服务器使用以下有效负载进行签名:'post\ndbs\n\n13 april 2015 18:21:05 gmt\n\n'\r\nActivityId: ...

我的 ruby​​ 代码如下所示:

require 'openssl'
require 'rest-client'
require 'base64'
require 'uri'
require 'json'
require 'time'

def get_databases url, master_key
time = Time.now.httpdate
authorization = get_master_auth_token "get", "", "dbs", time, master_key
header = { "authorization" => authorization, "x-ms-date" => time, "x-ms-version" => "2015-04-08" }
RestClient.get url, header
end

def get_master_auth_token verb, resource_id, resource_type, date, master_key
digest = OpenSSL::Digest::SHA256.new
key = Base64.decode64 master_key
text = verb + "\n" +
resource_type + "\n" +
resource_id + "\n" +
date + "\n" +
"\n"
hmac = OpenSSL::HMAC.digest digest, key, text.downcase
auth_string = "type=" + "master" + "&ver=" + "1.0" + "&sig=" + hmac
URI.escape auth_string
end

谢谢!

编辑:在 Ryan 的建议和示例之后,我将代码简化为以下片段,该片段应该与他发布的节点代码匹配,但在 ruby​​ 中仍然失败:

def hard_coded_get_databases master_key, url
verb = "get"
resource_type = "dbs"
resource_id = ""
date = Time.now.httpdate
serv_version = '2014-08-21'
master_token = "master"
token_version = "1.0"
key = Base64.decode64 master_key
text = verb + "\n" + resource_type + "\n" + resource_id + "\n" + date + "\n\n"
body = text.downcase.force_encoding "utf-8"
signature = OpenSSL::HMAC.digest OpenSSL::Digest::SHA256.new, key, body
auth_token = URI.escape("type="+master_token + "&ver="+token_version + "&sig="+signature)

header = { "accept" => "application/json", "x-ms-version" => serv_version, "x-ms-date" => date, "authorization" => auth_token }
RestClient.get url, header
end

EDIT2:我相信我已经将问题与我如何进行主 key 身份验证隔离开来。

以 Ryan 的例子为例,我们可以将他的节点代码精简如下:

var crypto = require("crypto")

function encode_message(masterKey, message) {
var key = new Buffer(masterKey, "base64"); // encode/decode? base64 the masterKey
var body = new Buffer(message.toLowerCase(), "utf8"); // convert message to "utf8" and lower case
return crypto.createHmac("sha256", key).update(body).digest("base64"); // encrypt the message using key
}

如果我调用此节点代码,我可以生成以下 key :

encode_message("blah", 'get\ncolls\n\nTue, 14 Apr 2015 13:34:22 GMT\n\n')
'IYlLuyZtVLx5ANkGMAxviDHgC/DJJXSj1gUGLvN0oM8='

如果我生成等效的 ruby​​ 代码来创建身份验证,我的 ruby​​ 代码如下所示:

require 'base64'
require 'openssl'

def encode_message master_key, message
key = Base64.urlsafe_decode64 master_key
hmac = OpenSSL::HMAC.digest 'sha256', key, message
Base64.urlsafe_encode64 hmac
end

如果我调用此代码,我会得到以下结果:

2.2.1 :021 > encode_message("blah", "get\ncolls\n\nTue, 14 Apr 2015 13:34:22 GMT\n\n")
=> "N6BL3n4eSvYA8dIL1KzlTIvR3TcYpdqW2UNPtKWrjP8="

显然,2 个编码的身份验证 token 不相同。 (瑞安再次非常感谢您的帮助才能走到这一步)。

最佳答案

我已经找到答案了。感谢 Magnus Stahre ...他是帮助我解决这个问题的人。

这就是我想的编码,技巧是这样的:

def encode_message master_key, message
key = Base64.urlsafe_decode64 master_key
hmac = OpenSSL::HMAC.digest 'sha256', key, message.downcase
Base64.encode64(hmac).strip
end

我过早地在代码中进行了小写,并且我的 Base64.encode64 未能去除 ruby​​ 在末尾添加的换行符。

关于ruby - 无法使用 HMAC 在 Ruby 中生成正确的加密 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29612613/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com