0x00 问题描述

现在我还在管理的游戏服务器最近上了对象存储加上七牛的全球CDN加速,来给国外的玩家进行资源下载的加速。由于现在很多脚本还在完善,会经常更新服务器上的脚本,这导致缓存在CDN和对象存储上的文件和服务器上的不一致。所以需要加一个程序来刷新不一致文件在对象存储和CDN上的缓存。七牛云的API为了保证每一个操作不被篡改,使用了HMAC-SHA1算法对所有请求进行了加密。并且为了传参的安全还对参数进行了Base64编码。

URL安全的Base64编码

URL安全的Base64编码适用于以URL方式传递Base64编码结果的场景。该编码方式的基本过程是先将内容以Base64格式编码为字符串,然后检查该结果字符串,将字符串中的加号+换成中划线-,并且将斜杠/换成下划线_。

https://developer.qiniu.com/kodo/manual/1231/appendix#urlsafe-base64

0x01 问题分析

由于游戏的脚本引擎最高支持LUA5.1,所以没法高效的进行HMAC-SHA1,这里我做了一个PHP借口对参数进行HMAC-SHA1加密和Base64编码,利用游戏引擎内置函数fetchRemote远程调用API。HMAC-SHA1使用私钥对字符串进行SHA1加密。

七牛Access Token格式可以参考

https://developer.qiniu.com/kodo/manual/1201/access-token

0x02 PHP代码

<?php
$SecretKey = '';      //七牛SecretKey
$AccessKey = '';    //七牛AccessKey

function Sign($data)
    {
        global $SecretKey;
        global $AccessKey;
        $sign = hash_hmac('sha1', $data, $SecretKey, true);
        return $AccessKey . ':' . Qiniu_Encode($sign);
    }
    
function Qiniu_Encode($str)    //URL安全的Base64编码
    {
        $find = array('+', '/');
        $replace = array('-', '_');
        return str_replace($find, $replace, base64_encode($str));
    }
    
function Qiniu_Decode($str)    //URL安全的Base64解码
{
    $find = array('-', '_');
    $replace = array('+', '/');
    return base64_decode(str_replace($find, $replace, $str));
}
echo Sign(Qiniu_Decode($_GET["data"]))    //获取URL中需要加密和授权的明文参数
?>

标签: PHP

评论已关闭