当前位置: 首页 > 知识库问答 >
问题:

使用python的sigv4 post示例

艾国安
2023-03-14

我正在尝试从中生成相同的签名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

共有1个答案

云洋
2023-03-14

代码中的错误

生成签名密钥的代码看起来不错。但是,当您生成签名时,会切换参数。伪代码是:

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???

很抱歉,我不知道。我怀疑留档实际上可能不准确,无论是关于签名值还是关于用于生成签名的输入参数值(密钥、日期、区域、服务、签名字符串)。

我确实觉得我提出这样的建议有点冒险,但同时,我从经验中知道,并非所有在线技术文档都是100%准确的(即使是由信誉良好的来源制作的)。

不管我怎么做,我都无法复制这个签名。我希望看到一个能够成功生成此哈希的答案。

证据啊

这里实际上只有两件事:

  • 计算签名密钥。

您的代码使用示例中“用其他语言导出签名密钥”下的参数生成预期的签名密钥。这表明您正确地计算了签名密钥。Python代码在这里。

当使用本例中的参数时,代码也会生成预期的签名。这表明您正在计算正确的签名密钥和正确的签名。这里是Python代码。

通过一些现有的Python代码运行您的问题中的参数,我知道这些代码可以与多个服务一起使用(基于此),也会产生相同的8afdb…9699e签名。

我还将java签名代码扔进了一个现有的Spring Boot应用程序,它还为您的输入参数生成了相同的8afdb...9699e签名。

尝试什么?

我建议您假设您的签名代码是好的,而此特定页面上的AWS文档是错误的。毕竟,您的代码至少可以与另外两个AWS示例配合使用。

使用您的凭证、您的bucket策略、您的地区、当前日期等,签署一个真正的请求。

然后张贴样品表格,看看是否有效。如果它不起作用,您可以用从表单POST中获得的错误更新问题。

更新(2018年7月15日)

AWS已经更新了他们的文档,该页面现在包含正确的签名。出于历史目的,可以在此处查看不正确的版本。

有趣的是,wayback机器显示该页面至少在2017年6月23日之前是正确的。到了7月14日,它已经改成了错误的签名,并且至少在2017年12月19日之前(超过5个月!)它一直是错误的。

 类似资料:
  • 本文向大家介绍python psutil库的使用示例,包括了python psutil库的使用示例的使用技巧和注意事项,需要的朋友参考一下 由于Bash实在太恶心,很多运维工程师开始使用Python代替Bash写各种脚本。 虽然理论上可以用Python调用Bash指令实现各种功能,但是给各种命令写Bash wrapper还要解析输出实在太麻烦。所以我们还是希望用原生Python库来实现各种功能。

  • 本文向大家介绍python中的__slots__使用示例,包括了python中的__slots__使用示例的使用技巧和注意事项,需要的朋友参考一下 正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。先定义class: 然后,尝试给实例绑定一个属性: 还可以尝试给实例绑定一个方法: 但是,给一个实例绑定的方法,对另一个实

  • 本文向大家介绍Python hashlib模块的使用示例,包括了Python hashlib模块的使用示例的使用技巧和注意事项,需要的朋友参考一下 一.hashlib模块 用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供 :SHA1,SHA224,SHA256,SHA384,SHA512,MD5算法。 1.使用hashlib模块进行MD5加密。 注:hashlib.md5():创

  • 本文向大家介绍Python中的__SLOTS__属性使用示例,包括了Python中的__SLOTS__属性使用示例的使用技巧和注意事项,需要的朋友参考一下 看python社区大妈组织的内容里边有一篇讲python内存优化的,用到了__slots__。然后查了一下,总结一下。感觉非常有用 python类在进行实例化的时候,会有一个__dict__属性,里边有可用的实例属性名和值。声明__slots_

  • 本文向大家介绍Python中的zip函数使用示例,包括了Python中的zip函数使用示例的使用技巧和注意事项,需要的朋友参考一下 zip函数接受任意多个(包括0个和1个)序列作为参数,返回一个tuple列表。具体意思不好用文字来表述,直接看示例: 1.示例1: 运行的结果是: [(1, 4, 7), (2, 5, 8), (3, 6, 9)] 从这个结果可以看出zip函数的基本运作方式。 2.示

  • 本文向大家介绍python爬虫之urllib3的使用示例,包括了python爬虫之urllib3的使用示例的使用技巧和注意事项,需要的朋友参考一下 Urllib3是一个功能强大,条理清晰,用于HTTP客户端的Python库。许多Python的原生系统已经开始使用urllib3。Urllib3提供了很多python标准库urllib里所没有的重要特性: 线程安全 连接池 客户端SSL/TLS验证 文