«

»

百度bae签名函数

快抢沙发

签名算法

百度云存储服务通过签名算法来利用用户的签名对请求者的身份进行验证。

签名过程涉及到的概念
AccessKey:公钥,简称ak
SecretKey:密钥,简称sk
Signature:利用公钥、密钥和用户的请求内容算出的签名,用于验证请求用户的身份。
每次请求都需要把相应的签名通过querystring的方式发送,例如:

Sign=MBO:aCLCZtoFQg8I:WQMFNZEhN2k8xxlgikuPfCJMuE8%3D
签名组成
Sign=Flag:AccessKey:Signature
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: 签名
Signture=urlencode(base64_encode(hash_hmac(‘sha1’, Content, SecretKey,true)))
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字节。

列表如下:
bucket:mybucket
object: /myobject
time:1312956443
ip=192.168.0.1
size=100
Flag=MBOTIS
说明: 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”
自制签名函数如下:

function MakeSign($AccessKey,$SecretKey,$flag,$method,$bucket,$object,$time,$ip,$size){
	//因为MBO是必需参数,剩下的TIS是选需参数,Flag的顺序为MBOTIS
	$Content = $flag . "\nMethod=".$method . "\nBucket=".$bucket . "\nObject=".$object . "\n" ;
	if($time) {
		$Content .= "Time=" . $time . "\n";
	}else if($ip) {
		$Content .= "Ip=" . $ip . "\n";
	}else if ($size) {
		$Content .= "Size=" . $size . "\n";
	}else {
	}

	$Signture=urlencode(base64_encode(hash_hmac('sha1', $Content, $SecretKey,true)));
	$Sign=$flag.":".$AccessKey.":".$Signture;
	return $Sign;
}

百度BAE签名函数

2013.05.19
H
阅读全文...

将xml格式字符串按xml输出或解析

快抢沙发

今天想弄一下阿里云的oss,阿里云默认返回的信息是xml。
下面给一个自己写的代码片段,大家不难发现body里面的内容其实是xml格式的,下面将将body里面的作为xml输出

$c=file_get_contents("http://127.0.0.1:8010/ali-oss/demo/tutorial.php");
$cc=trim(get_str($c,'-Body:','|-Header:'));
header("Content-type:text/xml;charset=utf-8"); 
echo $cc;
 

xml格式输出
下面是将返回的信息里面的body内容作为xml,并且解析获得Key和Size

$c=file_get_contents("http://127.0.0.1:8010/ali-oss/demo/tutorial.php");
$cc=trim(get_str($c,'-Body:','|-Header:'));
$xml=simplexml_load_string($cc);
foreach ($xml->Contents as $item) {  
	echo "<h2>" . $item->Key . "</h2>";  
	echo "<p>" . $item->Size . "</p>";  
}  
2013.05.18
H
阅读全文...

curl获取https开头的url的内容

快抢沙发

平时我们用curl一般都获取http页面的内容,代码如下

$theurl= "http://www.xx.com";
	
	$_data = array(
	'client_id' => $CLIENT_ID,
	'client_secret' => $CLIENT_SECRET,
	);
	
	$ch = curl_init();
	curl_setopt($ch,CURLOPT_URL,$theurl); //设置访问链接
	curl_setopt($ch,CURLOPT_POST,1); //设置POST请求方法
	curl_setopt($ch,CURLOPT_POSTFIELDS,$_data); //设置访问参数
	curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);   //将输出定向到变量
	$result = curl_exec($ch); //此时得到的结果是一个字符串
	curl_close($ch);
	var_dump ($result);

这是我们会把得到结果装到$result里面。
而在用上面的方法来对付https开头的url是,就会发现$result为空。
curl获取https内容
这是为啥呢,https跟http显然不同啊,如果图省事的话,我们可以在$ch = curl_init();后加上

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

这样就不用验证证书和host。

2013.05.13
H
阅读全文...

将object型转换为数组array型

快抢沙发

object貌似是最大的类型了,在使用数据的时候有的数据的键和值得形式基本上就是数组了,但是它却不是array类型,可以这样的函数转换一下就行了。

function object_to_array($obj) 
{ 
    $_arr = is_object($obj) ? get_object_vars($obj) : $obj; 
    foreach ($_arr as $key => $val) 
    { 
        $val = is_object($val) ? object_to_array($val) : $val; 
        $arr[$key] = $val; 
    }
    return $arr; 
}
2013.05.08
H
阅读全文...
  • sitemap_baidu