アプリ署名アルゴリズム

15271 ワード

説明 API , Secret Key 、 , API 、アプリケーションは、オープンプラットフォームAPIを呼び出し、署名を計算する必要がある.
請求方式
アプリケーションクライアントによって開始された
ページ内のJavaScript、Flash内のアクションScriptまたは携帯電話、デスクトップクライアントプログラムで開始します.署名は、要求パラメータとSession Secret(各ユーザのSession Keyに対応する鍵)によって指定された暗号化アルゴリズムによって生成される文字列である.
サードパーティのアプリケーションを通じて開始された
署名は、要求パラメータとアプリケーションの秘密鍵によって対応する暗号化アルゴリズムによって生成される.
署名の生成
署名の生成を行いません.
生成されない署名の場合もあり、例えばウェブサイトの開発前後で分離される.しかし、sessionの特性に基づいて、正常な業務処理をサポートすることができますが、必要な準備が必要です.
  • ログイン認証
  • post方式でデータを提出する
  • は、tokenトークンを構成し、例えばmd5(uniqid(rand(), TRUE))は、無効時間
  • を設定することができる.
  • .refererを検証し、同ソースポリシー計画
  • .
  • Appライセンス
  • などの
  • 署名鍵付き key sign 、身分認証とパラメータ改竄の問題を解決し、秘密鍵を外部に漏らさないでください.
  • は、対応するkey、secret
  • を割り当てる.
  • 署名生成規則
  • は、要求が期限切れであるかどうかを検証することができるパラメータ新規タイムスタンプtimestampを要求する.
  • $secretは暗号化として使用され、データの安全を保証するために要求パラメータに反映されないようにします.
  • アップグレードの最適化
    安全が相対的に高いシステムにとって、 ,header,body .例えば企業報告書、電子注文情報などです.
    データ暗号化/符号化アルゴリズムのリスト
    参考:http://blog.sina.com.cn/s/blog_4 f 0322 c 50101 lml.
    1、共通鍵アルゴリズム
    鍵アルゴリズムは、敏感なデータ、要約、署名などの情報を暗号化するために使用されます.
  • DES(Data Ecryption Standard):データの暗号化基準は、速度が速く、大量のデータを暗号化する場合に適用されます.
  • 3 DS(Triple DES):DESに基づいて、一つのデータを三つの異なる鍵で三回暗号化すると、強度がより高い.
  • RC 2とRC 4:大量のデータを変長鍵で暗号化するのはDESより速い.
  • IDEA(International Data Ecryption Algorithm)国際データ暗号化アルゴリズムは、128ビットの鍵を使用して非常に強いセキュリティを提供する.
  • RSA:RSA社によって発明された、長い鍵をサポートする公開鍵アルゴリズムであり、暗号化が必要なファイルの高速な長さも可変である.
  • DSA(Digital Signature Algorithm):デジタル署名アルゴリズムは、標準DSS(デジタル署名基準)である.
  • AES(Advanced Ecryption Standard):高級暗号化標準は、次世代の暗号化アルゴリズム標準であり、速度が速く、安全レベルが高く、現在のAES標準の一つの実現はRijdaelアルゴリズムである.
  • BLOWFISHは、長い鍵を使って、長さは448ビットに達することができます.
  • 他のアルゴリズム、例えばElGamal、Deffie-Hellman、新しい楕円曲線アルゴリズムECCなど.
  • 2、一方向ハッシュアルゴリズム
    一方向ハッシュ関数は、メッセージの要約、鍵の暗号化などを生成するために一般的に使われる.
  • MD 5(Message Digest Algorithm 5):RSAデータセキュリティ会社が開発した一方向ハッシュアルゴリズムであり、MD 5は広く使用されており、異なる長さのデータブロックを暗号化して128ビットの数値として計算することができる.
  • SHA(Secure Hash Algorithm)これは新しいハッシュアルゴリズムであり、任意の長さのデータ演算に対して160ビットの数値を生成することができる.
  • MAC(Message Authentication Code):メッセージ認証コードは、鍵を使用する一方向関数であり、ファイルまたはメッセージをシステム上またはユーザ間で認証することができる.HMAC(メッセージ認証のための鍵ハッシュ法)は、この関数の一例である.
  • CRC(Cyclic Redundency Check):巡回冗長検査コード、CRC検査は簡単なため、誤り検出能力が強く、様々なデータ検証アプリケーションで広く使用されている.システムリソースの占用が少なく、ハードウェアで実現できることは、データ伝送エラー検出を行うための良い手段である(CRCは厳密な意味でのハッシュアルゴリズムではないが、その役割はハッシュアルゴリズムとほぼ同じであるため、このような結果になる).
  • 3、他のデータアルゴリズム
    他のデータアルゴリズムは、Base 64、Quoted Printable、EBC DICなど、いくつかの一般的な符号化アルゴリズムとその和文変換などを含む.
    コード例を参考にしてください.
     /**
      *       
      * @param array $params API              ,   sign  
      * @return string        
      */
     function getSignature($params, $secret)
     {
        $str = ''; 
        ksort($params);
        foreach ($params as $k => $v) {
            $str .= "$k=$v";
        }
        $str .= $secret;
        return md5($str);
     }
    
    /*
     *     ,$args     ,$key   
     */
    function makeSignature($args, $key)
    {
        if(isset($args['sign'])) {
            $oldSign = $args['sign'];
            unset($args['sign']);
        } else {
            $oldSign = '';
        }
    
        ksort($args);
        $requestString = '';
        foreach($args as $k => $v) {
            $requestString .= $k . '=' . urlencode($v);
        }
        $newSign = hash_hmac("md5",strtolower($requestString) , $key);
        return $newSign;
    }
    
    pubkey = $pubkey;
            $this->privkey = $privkey;
        }
    
        /**  **/
        public function encrypt($data)
        {
            if (empty($data)) {
                return null;
            }
            $pem = "-----BEGIN PUBLIC KEY-----
    " . chunk_split($this->pubkey, 64, "
    ") . "-----END PUBLIC KEY-----
    "; $key = openssl_pkey_get_public($pem); $resultb = ""; $dataArray = str_split($data, 117); foreach ($dataArray as $d) { if (openssl_public_encrypt($d, $encrypted, $key)) { $resultb .= $encrypted; } else return null; } return base64_encode($resultb); } /** **/ public function decrypt($data) { $pem = "-----BEGIN PRIVATE KEY-----
    " . chunk_split($this->privkey, 64, "
    ") . "-----END PRIVATE KEY-----
    "; $key = openssl_pkey_get_private($pem); $resultb = ""; $dataArray = str_split(base64_decode($data), 128); foreach ($dataArray as $d) { if (openssl_private_decrypt($d, $encrypted, $key)) { $resultb .= $encrypted; } else return null; } return $resultb; } /** **/ public function md5($data) { $xtt=urlencode(base64_encode(md5($data))); // return $xtt; } }
    crc_table[(($crc>>8) ^ ord($ptr[$i]))] ^ (($crc<<8) & 0x00FFFF);
            $ret = sprintf('%02x%02x', floor($crc/256),$crc%256);
            return strtoupper($ret);
        }
    }
    
    key = $key;
    
            $this->iv = $iv;
        }
    
        function encrypt($str) {
    
            $size = mcrypt_get_block_size(MCRYPT_DES, MCRYPT_MODE_CBC);
            $str = $this->pkcs5Pad($str, $size);
    //        echo $size.'
    '; // echo $str."
    "; // echo $this->key.'
    '; // echo $this->iv.'
    '; // return mcrypt_cbc(MCRYPT_DES, $this->key, $str, MCRYPT_ENCRYPT, $this->iv); $cipher = mcrypt_module_open(MCRYPT_DES, '', 'cbc', ''); mcrypt_generic_init($cipher, $this->key, $this->iv); return mcrypt_generic($cipher, $str); } function decrypt($str) { $strBin = $str; // $str = mcrypt_cbc(MCRYPT_DES, $this->key, $strBin, MCRYPT_DECRYPT, $this->iv); $cipher = mcrypt_module_open(MCRYPT_DES, '', 'cbc', ''); mcrypt_generic_init($cipher, $this->key, $this->iv); $str = mdecrypt_generic($cipher, $str); $str = $this->pkcs5Unpad($str); return $str; } function pkcs5Unpad($text) { $pad = ord($text{strlen($text) - 1}); if ($pad > strlen($text)) return false; if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false; return substr($text, 0, -1 * $pad); } function pkcs5Pad($text, $blocksize) { $pad = $blocksize - (strlen($text) % $blocksize); return $text . str_repeat(chr($pad), $pad); } } class SaaSSafe{ private $iv; function set_iv($i){ if($i != ''){ $this->iv = $i; } } public function Encode($o_string){ $md5_string = md5($o_string); $body_string = $md5_string.$o_string; $key = $this->makeKey($this->iv); $des_body_string = $this->desEn($body_string, $this->iv, $key); $ret = base64_encode($des_body_string); return $ret; } public function Decode($o_string){ $de_base_string = base64_decode($o_string); $key = $this->makeKey($this->iv); $de_des_string = $this->desDe($de_base_string, $this->iv, $key); $ret = substr($de_des_string, 32); return $ret; } function odd($o_string){ $ret = ''; for ($i=0; $iodd(substr(md5($iv),8,16)); } } private function desEn($o_string, $iv, $key){ $des = new DES($key, $iv); $ret = $des->encrypt($o_string); return $ret; } private function desDe($o_string, $iv, $key){ $des = new DES($key, $iv); $ret = $des->decrypt($o_string); return $ret; } }
    /*
      :
    https://mp.weixin.qq.com/s?__biz=MjM5NDM4MDIwNw==&mid=2448834812&idx=1&sn=d27c9478b98a184acdb8ca7e9fbfc751&chksm=b28a403c85fdc92aca0461556ee3b1114bbf43fe630baeb0a61f72187dcd6d355018baa1f82b#rd
    
    */
    
    class Rsa2
    {
        private static $PRIVATE_KEY = 'rsa_private_key.pem   ';
        private static $PUBLIC_KEY  = 'rsa_public_key.pem   ';
    
        /**
         *     
         * @return bool|resource
         */
        private static function getPrivateKey()
        {
            $privKey = self::$PRIVATE_KEY;
            return openssl_pkey_get_private($privKey);
        }
    
        /**
         *     
         * @return bool|resource
         */
        private static function getPublicKey()
        {
            $publicKey = self::$PUBLIC_KEY;
            return openssl_pkey_get_public($publicKey);
        }
    
        /**
         *     
         * @param string $data   
         * @return null|string
         */
        public function createSign($data = '')
        {
            if (!is_string($data)) {
                return null;
            }
            return openssl_sign(
                        $data,
                        $sign,
                        self::getPrivateKey(),
                        OPENSSL_ALGO_SHA256
                      ) ? base64_encode($sign) : null;
        }
    
        /**
         *     
         * @param string $data   
         * @param string $sign   
         * @return bool
         */
        public function verifySign($data = '', $sign = '')
        {
            if (!is_string($sign) || !is_string($sign)) {
                return false;
            }
            return (bool)openssl_verify(
                          $data,
                          base64_decode($sign),
                          self::getPublicKey(),
                          OPENSSL_ALGO_SHA256
                        );
        }
    }
    
    追加:byte
    = 128){
                      $byte = ord($str[$i]) - 256;
                  }else{
                      $byte = ord($str[$i]);
                  }
                $bytes[] =  $byte ;
           }
           return $bytes;
       }
       
       /**
        *         String     
        * @param $bytes     
        * @param $str      
        * @return   String     
        */
        
       public static function toStr($bytes) {
           $str = '';
           foreach($bytes as $ch) {
               $str .= chr($ch);
           }
    
              return $str;
       }
       
       /**
        *     int byte  
        * @param $byt   byte  
        * @param $val         
        * @author Zikie
        */
       
       public static function integerToBytes($val) {
           $byt = array();
           $byt[0] = ($val & 0xff);
           $byt[1] = ($val >> 8 & 0xff);
           $byt[2] = ($val >> 16 & 0xff);
           $byt[3] = ($val >> 24 & 0xff); 
           return $byt;
       }
       
       /**
        *                Integer     
        * @param $bytes     
        * @param $position        
        * @return   Integer     
        */
        
       public static function bytesToInteger($bytes, $position) {
           $val = 0;
           $val = $bytes[$position + 3] & 0xff; 
           $val <<= 8;
           $val |= $bytes[$position + 2] & 0xff;
           $val <<= 8;
           $val |= $bytes[$position + 1] & 0xff;
           $val <<= 8;
           $val |= $bytes[$position] & 0xff;
           return $val;
       }
    
       /**
        *     shor    byte  
        * @param $byt   byte  
        * @param $val         
        * @author Zikie
        */
       
       public static function shortToBytes($val) {
           $byt = array();
           $byt[0] = ($val & 0xff);
           $byt[1] = ($val >> 8 & 0xff);
           return $byt;
       }
       
       /**
        *                Short     。
        * @param $bytes     
        * @param $position        
        * @return   Short     
        */
        
       public static function bytesToShort($bytes, $position) {
           $val = 0;
           $val = $bytes[$position + 1] & 0xFF; 
           $val = $val << 8;
           $val |= $bytes[$position] & 0xFF;
           return $val;
       }
       
    }
    ?>