PHP-MD5加密研究

    md5(string,raw);
    

参数 描述
string 必需。规定要计算的字符串。
raw 可选。规定十六进制或二进制输出格式:TRUE - 原始 16 字符二进制格式; FALSE - 默认。32 字符十六进制数;

    

接口的签名验证:

function verify_app_key(){
    $request = $GLOBALS['context']->request;
    $db = $GLOBALS['context']->db;
    if(!isset($GLOBALS['context']->config['api_version'])){
        $api_version = 1;
    }else{
        $api_version = $GLOBALS['context']->config['api_version'];
    }
    //判断是否传过来了sign参数
    if(!isset($request['key']) || !isset($request['sign']))
        return return_value(-1,"缺少sign参数");
    //从数据库中取出key和secret
    $sql = "select * from api_user where `key` = '".$request['key']."'";
    $api_user = $db->get_row($sql);
    
    if(!$api_user){
        return return_value(-1,"账号不存在");
    }

    //验证签名时间

     if(isset($api_version) && $api_version == 2){
        if($request['timestamp']+300 < time()){
            return return_value(-1,"时间错误");
        }
    }
    //将请求过来的sign赋值给$post_sign保存
    $post_sign = $request['sign'];
   //根据签名规则生成签名
    $sign = create_sign($api_user['key'],$api_user['password'],$request);
    //比对签名是否相同
    if($post_sign != $sign){
        return return_value(-1,"sign错误");
    }
    return return_value(1,"");
}

//生成签名函数

function create_sign($app_key,$app_secret,$data){
    if(!isset($GLOBALS['context']->config['api_version'])){
        $api_version = 1;
    }else{
        $api_version = $GLOBALS['context']->config['api_version'];
    }
    if(isset($api_version) && $api_version == 2){

        unset($data['sign']);//去除传过来的sign

        ksort($data);//对数据按照首字母顺序进行排序
        $sign = "";

       //排序完成后按照key.value组成字符串

        foreach ($data as $k=>$v){
            $sign .= $k.$v;
        }
        $sign = md5_3($app_key . $sign . $app_secret);
    }else{
        $sign = md5($app_key.$app_secret.add_day_time());
    }
    return $sign;
}

//md5_3加密方式(两次MD516位加密,一次32位加密后全部转换为大写)
function md5_3($str) {
    return strtoupper(md5(md5(md5($str, true), true)));
}



你可能感兴趣的:(PHP-MD5加密研究)