我想我已经阅读了几乎所有有关浏览器内基于表单的 S3 签名的 Base-64 编码的内容:旧文档和新文档。例如:
http://doc.s3.amazonaws.com/proposals/post.html http://doc.s3.amazonaws.com/proposals/post.html
甚至发现了这个:
http://s3.amazonaws.com/doc/s3-example-code/post/post_sample.html http://s3.amazonaws.com/doc/s3-example-code/post/post_sample.html
我没有使用上面的或亚马逊更新的策略生成器,也没有摆弄 Boto,而是尝试起草一个更简单的 .py 脚本,从纯文本文件 (policy.txt) 中提取策略 JSON,然后生成必要的基本 - 64 编码签名来帮助我起草 HTML 表单。
签名本身(依赖于编码策略)未正确编码...可能是由于某种 utf-8 与 ascii 或 \n (换行符)问题?
我正在使用的脚本如下,策略和AWS密钥private_key
来自我用来查看此脚本是否有效的 AWS 测试用例。亚马逊引用的正确编码的签名包含在下面的脚本中以供参考。
谁能告诉我为什么下面计算的签名与亚马逊提供的参考签名不匹配?:
换句话说:
为什么这是正确编码的:
policy_encoded = base64.b64encode(policy)
但这不是:
signature = base64.b64encode(hmac.new(private_key, policy_encoded, sha).digest())
PYTHON签名计算器...
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import base64, hmac, sha
from sys import argv
script, policy = argv
private_key = 'uV3F3YluFJax1cknvbcGwgjvx4QpvB+leU8dUj2o'
input = open("..Desktop/policy.txt", "rb")
policy = input.read()
policy_encoded = base64.b64encode(policy)
signature = base64.b64encode(hmac.new(private_key, policy_encoded, sha).digest())
print "Your policy base-64 encoded is %s." % (policy_encoded)
print "Your signature base-64 encoded is %s." % (signature)
print "Your signature encoded should be 2qCp0odXe7A9IYyUVqn0w2adtCA="
JSON 策略(policy.txt--UTF-8)
{ "expiration": "2007-12-01T12:00:00.000Z",
"conditions": [
{"bucket": "johnsmith"},
["starts-with", "$key", "user/eric/"],
{"acl": "public-read"},
{"success_action_redirect": "http://johnsmith.s3.amazonaws.com/successful_upload.html"},
["starts-with", "$Content-Type", "image/"],
{"x-amz-meta-uuid": "14365123651274"},
["starts-with", "$x-amz-meta-tag", ""]
]
}