我正在尝试从中生成相同的签名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
代码中的错误
生成签名密钥的代码看起来不错。但是,当您生成签名时,会切换参数。伪代码是:
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验证 文