Sign簽名生成與校驗

參數說明:

from 接口發起方標識,由管理員分配
secret 密鑰,由管理員分配
sign 簽名
timestamp 時間戳 s (用於校驗簽名有效期)

sign算法;
1.對所有參數(此時不含sign參數)升序排列得出arrarg
2.把arrarg的值以’&’拼接成一個字符串得出strarg
3.secret.’&’.strarg.’&’.secret得出sign

<?php
defined('BASEPATH') OR exit('No direct script access allowed');


/**
 * 發起方 校驗類
 */
class Sign {


    const TIME = 'timestamp';
    const FROM = 'from';
    const SIGN = 'sign';

    const TIMEOUT = 30; // 簽名有效期 s

    private $ci;
    private $froms;


    public function __construct()
    {
        $this->ci =& get_instance();
        $this->froms = $this->ci->config->item('api_froms');
    }


    /**
     * [create 生成簽名]
     * @param  [array] $args [參數列表]
     * @param  [string] $secret [密鑰]
     * @return [string] sign
     */
    public function create($args,$secret)
    {
        if(isset($args[self::SIGN]))
        {
            unset($args[self::SIGN]);
        }
        if(!is_array($args))
        {
            return FALSE;
        }
        else
        {
            ksort($args);
            $strArgs = implode('&', $args);
            return md5($secret.'&'.$strArgs.'&'.$secret);
        }
    }

    /**
     * [valid 校驗請求]
     * @param  string $method [調用方式]
     * @return [array]
     */
    public function valid($data)
    {
        $err = -2;
        $msg = 'falid';
        if( FALSE === $secret=$this->checkFrom($data) )
        {
            $msg = 'the from is not defined';
        }
        elseif(FALSE === $this->checkTime($data))
        {
            $msg = 'the sign is overdue';
        }
        elseif(FALSE === $this->checkSign($data,$secret))
        {
            $msg = 'the sign is wrong';
        }
        else
        {
            $err = 2;
            $msg = 'ok';
        }
        return array('err'=>$err,'msg'=>$msg);
    }

    private function checkSign($data,$secret)
    {
        $sign = isset($data[self::SIGN]) ? $data[self::SIGN] : FALSE;
        if(!$sign )
        {
            return FALSE;
        }
        elseif($sign != $this->create($data,$secret))
        {
            return FALSE;
        }
        else
        {
            return TRUE;
        }
    }

    private function checkTime($data)
    {
        if(! isset($data[self::TIME]))
        {
            return FALSE;
        }
        elseif( self::TIMEOUT < intval(time()-$data[self::TIME]) )
        {
            return FALSE;
        }
        else
        {
            return TRUE;
        }
    }

    private function checkFrom($data)
    {
        if( ! isset($this->froms[$data[self::FROM]]) )
        {
            return FALSE;
        }
        else
        {
            return $this->froms[$data[self::FROM]];
        }
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章