- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试从 http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html 生成相同的签名使用 python,
DateKey = hmac.new(b'AWS4wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY', b'20151229', hashlib.sha256).digest()
DateRegionKey = hmac.new(DateKey, b'us-east-1', hashlib.sha256).digest()
DateRegionServiceKey = hmac.new(DateRegionKey, b's3', hashlib.sha256).digest()
SigningKey = hmac.new(DateRegionServiceKey, b'aws4_request', hashlib.sha256).digest()
signature = hmac.new(other_policy, SigningKey, hashlib.sha256).hexdigest()
但我的签名是cb0b0ec487fd5e01382c9c3b6b6a6dfa170da312ddab58a4b18869e7413951be
预期的签名是 46503978d3596de22955b4b18d6dfb1d54e8c5958727d5bdcd02cc1119c60fc9
我哪里做错了?
注意
other_policy = b'''eyAiZXhwaXJhdGlvbiI6ICIyMDE1LTEyLTMwVDEyOjAwOjAwLjAwMFoiLA0KICAiY29uZGl0aW9ucyI6IFsNCiAgICB7ImJ1Y2tldCI6ICJzaWd2NGV4YW1wbGVidWNrZXQifSwNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRrZXkiLCAidXNlci91c2VyMS8iXSwNCiAgICB7ImFjbCI6ICJwdWJsaWMtcmVhZCJ9LA0KICAgIHsic3VjY2Vzc19hY3Rpb25fcmVkaXJlY3QiOiAiaHR0cDovL3NpZ3Y0ZXhhbXBsZWJ1Y2tldC5zMy5hbWF6b25hd3MuY29tL3N1Y2Nlc3NmdWxfdXBsb2FkLmh0bWwifSwNCiAgICBbInN0YXJ0cy13aXRoIiwgIiRDb250ZW50LVR5cGUiLCAiaW1hZ2UvIl0sDQogICAgeyJ4LWFtei1tZXRhLXV1aWQiOiAiMTQzNjUxMjM2NTEyNzQifSwNCiAgICB7IngtYW16LXNlcnZlci1zaWRlLWVuY3J5cHRpb24iOiAiQUVTMjU2In0sDQogICAgWyJzdGFydHMtd2l0aCIsICIkeC1hbXotbWV0YS10YWciLCAiIl0sDQoNCiAgICB7IngtYW16LWNyZWRlbnRpYWwiOiAiQUtJQUlPU0ZPRE5ON0VYQU1QTEUvMjAxNTEyMjkvdXMtZWFzdC0xL3MzL2F3czRfcmVxdWVzdCJ9LA0KICAgIHsieC1hbXotYWxnb3JpdGhtIjogIkFXUzQtSE1BQy1TSEEyNTYifSwNCiAgICB7IngtYW16LWRhdGUiOiAiMjAxNTEyMjlUMDAwMDAwWiIgfQ0KICBdDQp9'''
来自 http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html
最佳答案
代码中的错误
您生成签名 key 的代码看起来不错。但是,当您生成签名时,参数会被调换。伪代码是:
Hex(HMAC-SHA256(SigningKey, StringToSign))
所以代替
signature = hmac.new(other_policy, SigningKey, hashlib.sha256).hexdigest()
你应该有
signature = hmac.new(SigningKey, other_policy, hashlib.sha256).hexdigest()
还是错了?
这会产生以下签名,尽管有 Amazon 文档,但我认为对于提供的 base64 字符串进行签名是正确的:
8afdbf4008c03f22c2cd3cdb72e4afbb1f6a588f3255ac628749a66d7f09699e
那么为什么亚马逊说签名应该是465039...c60fc9
???
很抱歉,我不知道。我怀疑文档实际上可能不准确,无论是关于签名值还是关于用于生成它的输入参数值( key 、日期、区域、服务、要签名的字符串)。
我确实觉得我有点冒昧地提出这样的建议,但与此同时,我从经验中知道,并非所有在线技术文档都是 100% 准确的(即使是由信誉良好的来源)。
无论我怎样尝试,我都无法重现这个签名。我喜欢看到成功生成此散列的答案。
证据
这里实际上只发生了两件事:
您的代码使用 "Deriving the Signing Key with Other Languages" here 下示例中的参数生成预期的签名 key .这表明您正在正确计算签名 key 。 Python 代码 here .
当使用来自 this example 的参数时,您的代码也会产生预期的签名.这表明您正在计算正确的签名 key 和正确的签名。 Python 代码 here .
通过一些我知道可用于多种服务(基于 this )的现有 Python 代码运行您问题中的参数也会产生相同的 8afdb...9699e
签名。
我还扔了 java signing code into an existing spring boot application ,它还会为您的输入参数生成相同的 8afdb...9699e
签名。
尝试什么?
我建议您假设您的签名代码是好的,并且此特定页面上的 AWS 文档是错误的。毕竟,您的代码至少可以与其他两个 AWS 示例一起正常工作。
签署真实请求,使用您凭证、您存储桶策略、您区域、当前日期等
然后发布示例表单,看看它是否有效。如果它不起作用,您可以使用从表单 POST
中获得的错误更新问题。
更新(2018 年 7 月 15 日)
AWS 已更新其文档,并且 this page现在包含正确的签名。版本不正确can be viewed here , 出于历史目的。
有趣的是,回溯机器表明该页面至少在 2017 年 6 月 23 日之前都是正确的。到 7 月 14 日,它已更改为错误的签名,并且至少一直保持到 12 月 19 日, 2017 年(超过 5 个月!)。
关于python - 使用 python 的 sigv4-post-example,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47701044/
我已经制作了一个用于报名参加 Activity 的小应用程序。用户输入他们的数据,然后单击“登录我”。 现在有时人们在数据库中是双倍的,完全相同的数据彼此之间很快被插入了两次。这只能表示某人单击了两次
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: PHP: “Notice: Undefined variable” and “Notice: Undefin
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: PHP: “Notice: Undefined variable” and “Notice: Undefin
我正在尝试将数据从 Textarea 发布到经典的 ASP 脚本,该脚本更新本地计算机上的 MS SQL,然后发布到另一台服务器上的 PHP 脚本。但是,执行以下操作不起作用,因为它会切断文本区域的数
无效的代码: login_form = page.form_with(:method => 'post') 和有效的代码: login_form = page.form_with(:method =>
我希望能够在 HTTP Post 请求被触发时拦截它,然后修改其请求正文(或参数),然后发送它。 这怎么可能用 jquery/js 实现。 谢谢 最佳答案 Jquery ajax beforeSend
我想编写一个 Mysql 语句,从表(发布)中选择所有内容,其中标题类似于 $title 除了 $title 的标题。基本上我想显示某个帖子的所有相关帖子。我希望查询选择表中标题或详细信息中具有标题名
我已经成功创建了一个简单的 HTML 表单,它将上传的文件发布到我的 Amazon S3 存储桶。我遵循了以下说明: http://aws.amazon.com/articles/1434 现在我正在
我正在实现一个 PayPal IPN 页面,并想检查以确保请求真正来自 PayPal 而不是被欺骗。我假设 HTTP_REFERRER 不是一个好的检查方式?我已经尝试过这种方法,但变量只是空的。 有
我有一个非常简单的设置有一个非常特殊的问题。 该设置部署了 nginx Web 服务器以提供一些静态页面。它还有一个用于处理 POST 请求的后端 uwsgi 守护进程。 我的nginx位置配置如下
我认为我做错了什么,或者误解了我在网上阅读的有关 POST 和 GET 请求的内容。我在 myNumber.ejs 上有一个提交表单。当我按下提交时,有 Add.ejs 的 View 。 Add.ej
我需要将数据从 Express 应用程序的前端发送到后端,然后使用需要显示该数据的 EJS 呈现页面。 问题是 app.post() 方法,随后 res.render() 函数似乎没有完全执行或者当我
根据AWS Documentation对于 CloudFormation cfn-hup 帮助程序脚本,cfn-hup Hook 可以具有“要检测的以逗号分隔的条件列表”。这些条件/触发器可以是 po
位于“wp-admin/includes/”的“post.php”文件中的 wordpress 函数“get_default_post_to_edit”无法正常工作。 当我加载页面时:wp-admin
我使用请求库发布数据,但在服务器上收到空主体,没有传递任何数据。我在代码中遗漏了什么吗? Map map = new Map(); map[csrfNameKey] = csrfName;
我正在尝试使用 siege 3.0.1 测试我的网站。但是好像siege不发送POST数据。这是我从网络浏览器收到的请求 POST / HTTP/1.0 Accept: text/html,appli
我正在尝试为 stockfigher 游戏 api 编写包装器,只是为了了解 feign 是如何工作的,而且我在第一个 POST 方法中遇到了问题: @RequestMapping(method =
如何使用 Jersey 获取原始 POST? @FormParam将不起作用,因为我发布的原始 JSON 不在任何特定的 POST 字段中。 最佳答案 Jersey 带有一个用于将 JSON 映射到
我正在尝试同时创建一个实体和两个子实体的实例。 如果我将以下 JSON 发布到/user_objects 资源,它会很高兴地创建父 user_object 实体和链接的 User_object_att
在 IPV6 中如何使用 IPV6 地址和端口号构建 CURL POST http 请求。任何类型的线程都将受到赞赏。 尝试构建如下请求 >curl --interface 'http://[2001
我是一名优秀的程序员,十分优秀!