返回首页 2017-11

URI参数签名算法

2017-11-30 14:16:12 评论: 0

  应用基于HTTP POST或HTTP GET请求发送Open API调用请求时,为了确保应用与百度REST服务器之间的安全通信,防止Secret Key盗用、数据篡改等恶意攻击行为,百度REST服务器使用了参数签名机制。应用在调用百度Open API之前,需要为其所有请求参数计算一个MD5签名,并追加到请求参数中,参数名为“sign”。百度REST服务器在接收到请求时会重新计算签名,并判断其值是否与应用传递过来的sign参数值一致,以此判定当前Open API调用请求是否是被第三者伪造或篡改。

 应用在调用Open API之前需要通过 百度OAuth2.0服务获得用户或平台的授权,获取到授权后将会拿到以下3个重要参数:

  • access_token:基于https调用Open API时所需要的访问授权码;
  • session_key:基于http调用Open API时所需要的访问授权码;
  • session_secret:基于http调用Open API时计算参数签名用的签名密钥。

  其中,session_secret这个参数就是做参数签名时所需要的签名密钥。这与Facebook、人人网等平台稍微有所区别,这两个平台在做参数签名时所用的签名密钥一般有2个:

  如果是通过应用服务端调用Open API,则注册应用时所拿到的应用密钥(即API Key)就是参数签名密钥;如果是通过JavaScript、ActionScript等客户端语言调用Open API,则应用获取到用户授权后所拿到的Session Secret就是参数签名密钥。当然,通过服务端调用Open API时也可以用Session Secret作为签名密钥。

签名算法

  假设参与参数签名计算的请求参数分别是“k1”、“k2”、“k3”,它们的值分别是“v1”、“v2”、“v3”,则参数签名计算方法如下:

  • 将请求参数格式化为“key=value”格式,即“k1=v1”、“k2=v2”、“k3=v3”;
  • 将格式化好的参数键值对以字典序升序排列后,拼接在一起,即“k1=v1k2=v2k3=v3”;
  • 在拼接好的字符串末尾追加上应用通过百度OAuth2.0协议获取Access Token时所获取到的session_secret参数值;

上述字符串的MD5值即为签名的值。 注意:计算签名时的请求参数中不要包含sign(签名)参数,因为sign参数的值此时还不知道,有待计算。

另外,计算签名的时候不需要对参数进行urlencode处理(“application/x-www-form-urlencoded”编码),但是发送请求的时候需要进行urlencode处理,这是很多开发者最容易犯错的地方。

PHP代码实现

获取签名的PHP代码实现方式如下所示:

/**
  * 签名生成算法
  * @param  array  $params API调用的请求参数集合的关联数组,不包含sign参数
  * @param  string $secret 签名的密钥即获取access token时返回的session secret
  * @return string 返回参数签名值
  */
 function getSignature($params, $secret)
 {
    $str = '';  //待签名字符串
    //先将参数以其参数名的字典序升序进行排序
    ksort($params);
    //遍历排序后的参数数组中的每一个key/value对
    foreach ($params as $k => $v) {
        //为key/value对生成一个key=value格式的字符串,并拼接到待签名字符串后面
        $str .= "$k=$v";
    }
    //将签名密钥拼接到签名字符串最后面
    $str .= $secret;
    //通过md5算法为签名字符串生成一个md5签名,该签名就是我们要追加的sign参数值
    return md5($str);
 }
更多

设置MYSQL允许用IP访问

2017-11-21 22:48:19 评论: 0
mysql>use mysql;
mysql>update user set host = '%'  where user ='root';
mysql>flush privileges;
mysql>select 'host','user' from user where user='root';
mysql>quit
更多

PHP10条小技巧

2017-11-08 09:48:22 评论: 0
  • 1.foreach效率更高,尽量用foreach代替while和for循环;

  • 2.循环内部不要用变量,尤其是对象这样的变量;

  • 3.在多重嵌套循环中,如有可能,应当将最长的循环放在内层,最短循环放在外层,从而减少cpu跨循环层的次数,优化程序性能;

  • 4.用单引号替代双引号引用字符串以实现PHP性能优化;

  • 5.用i+=1替代i=i+1,符合c/c++的习惯,效率还高;

  • 6.优化Select SQL语句,在可能的情况下尽量少的进行Insert、Update操作,达到PHP性能优化的目的;

  • 7.尽量的少进行文件操作,虽然PHP的文件操作效率也不低的;

  • 8.尽可能的使用PHP内部函数;

  • 9.在可以用PHP内部字符串操作函数的情况下,不要用正则表达式;

  • 10.feof、fgets、fopen、在可以用file_get_contents替代file、系列方法的情况下,尽量用 file_get_contents,因为它的效率高得多。但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题。

更多

2017-11-4

2017-11-05 07:46:21 评论: 0

  代码撸累了,就在这里休息一下。周末加班,却也跟大学同学约了一波。

  大学室友老三,11/11要飞美国留学,于是大家决定今天聚一聚。谢谢各位体谅我加班,来环球中心将就我好上班。

  以前总觉得时间很慢,可以肆意挥霍,现在却在感叹时间过得太快,还没做好准备就匆匆过去。大学毕业几年,工作的工作,深造的继续在学校,还能一直保持联系的同学确实不多了,这是很珍贵的一份感情,希望明年,老三回来的时候,我不会像现在这样,还在入门的阶段苦苦的挣扎。身边的人,都被各种烦恼琐事缠绕,其实我现在也很迷茫,对于未来,对于生活,只能一步一步往前走,或许熬过一段时间就会看到路标。

  忘了在哪儿看到的一个小故事:小孩子问父亲,为什么小孩子不能喝酒?他父亲回答说:因为小孩子不喝酒也很快乐啊。或许成年人的世界就是这样,大家都是一样的,其实也没必要太烦恼吧,保持积极向上的心态,生活该怎么过还得怎么过,共勉!

更多

nginx buffered to a temporary 问题解决

2017-11-04 10:00:03 评论: 0

  最近项目上传到服务器了,本地很多都没有问题的,结果一到服务器就各种问题出来了,昨天就遇到了图片上传的问题。   看了网上的问题,主要是:

  • 1.nginx的fastcgi设置的fastcgi_buffers太小,导致将缓存写入磁盘;
  • 2.rewrite规则里的变量rule_1的问题,要改nginx配置:
if (!-f $document_root$uri){
        rewrite ^/.*$ /rewrite.php last;
}
  • 3.权限问题;

  而我跟同事遇到的问题,则是权限引起的,因为本地开发环境我们都是用的root身份,所以不存在这个问题,而在服务器上就不一样了,通常我们为了安全,是以一个较低权限的用户组在运行nginx。nginx的proxy模块可以实现类似于Squid的缓存功能,我们上传文件的时候,会在配置或者nginx默认的一个缓存目录下生成temp文件夹来缓存文件(通常默认的是/usr/local/nginx/proxy_temp,具体看配置情况),而恰恰就是因为当前用户组没有权限对该目录写入信息,所以就上传失败了。解决办法就是赋予用户组该目录755权限就可以了,考虑安全性问题通常不给过高的权限。

  最近遇到各种问题,但是都没还好好整理,不过真的是学到好多东西,希望这个问题能帮助到遇到同样问题的人。

更多