Answers
签名过程涉及到的概念
- AccessKey: 公钥,简称ak
- SecretKey: 密钥,可以在平台申请,简称sk
- Signature: 利用公钥,密钥和用户的请求内容算出的签名。用来验证用户。
每次请求都需要把相应的签名通过querystring的方式发送,比如:
签名组成
- Flag: 表明签名的对象。云存储需要根据Flag来判断签名的具体对象。
Flag=[M|B|O|T|I|S],可以是多个组合,但是必须顺序给出。
M: 请求的method, 可以是[PUT|GET|POST|DELETE|HEAD]
B: bucket name
O: object name
T: 链接的有效截止时间。 比如 time=1312956443表明在时间点Wed Aug 10 2011 14:07:23前有效
I: 访问ip限制。比如ip=192.168.0.1表示只有此ip能访问该链接
S:限制上传object大小,比如size=100,表示不能上传大小超过100B的object
- AccessKey: 参考如上介绍
- Signature: 签名 <coding-4 lang="php"> Signture=urlencode(base64_encode(hash_hmac('sha1', Content, SecretKey,true))) </coding>
content由Flag、 bucket、object,以及各个参数组成。
原理
用户根据自己申请的AccessKey,SecretKey和请求的内容计算出Signature,然后通过querystring的方式发生给云存储。
云存储按照AccessKey知道对应的SecretKey,然后根据Flag来算出签名,如果云存储计算的与请求的相同,则认证通过。否则返回403
举例
现在需要上传资源到bucket: mybucket
其中object为: /myobject
但是要求此链接在时间点“Wed Aug 10 2011 14:07:23”前有效,同时只允许ip:192.168.0.1访问。 上传文件的大小不能超过100字节.列表如下:
Flag=MBOTIS表示需要对method,bucket,object,time,ip,size做签名。
注意:flag必须严格按照[M|B|O|T|I|S]的顺序。那么contet计算如下:
Content= Flag + "\n"
+ "Method=PUT" + "\n"
+ "Bucket=mybucket" + "\n"
+ "Object=/myobject" + "\n"
+ "Time=1312956443" + "\n"
+ "Ip=192.168.0.1" + "\n"
+ "Size=100" + "\n"
引用:http://developer.baidu.com/wiki/index.php?title=%E5%B8%AE%E5%8A%A9%E6%96%87%E6%A1%A3%E9%A6%96%E9%A1%B5/%E7%AD%BE%E5%90%8D%E7%AE%97%E6%B3%95
Mimori
answered 12 years, 5 months ago