초등학교 승 평론 Api 서명 알고리즘

13213 단어
묘사 하 다.
제3자 애플 리 케 이 션 과 API 서버 간 통신 의 안전성 을 확보 하고 Secret Key 도용, 데이터 변조 등 악의 적 인 공격 행 위 를 방지 하기 위해 플랫폼 API 서버 를 열 어 서명 체 제 를 사용 하고 오픈 플랫폼 API 호출 에 적용 하려 면 하나의 서명 을 계산 해 야 한다.
요청 시작 방식
응용 클 라 이언 트 를 통 해 시 작 된
페이지 에 있 는 JavaScript, Flash 에 있 는 ActionScript 나 핸드폰, 데스크 톱 클 라 이언 트 프로그램 을 통 해 시작 합 니 다.서명 은 요청 인자 와 Session Secret (모든 사용자 의 Session Key 에 대응 하 는 키) 가 지정 한 암호 화 알고리즘 을 통 해 생 성 된 문자열 입 니 다.
제3자 응용 서버 를 통 해 시 작 된
서명 은 요청 파라미터 와 응 용 된 비밀 키 가 대응 하 는 암호 화 알고리즘 을 통 해 생 성 됩 니 다.
서명 생 성
서명 생 성 안 함
생 성 되 지 않 은 서명 도 존재 합 니 다. 예 를 들 어 웹 사이트 개발 전후 단 분리 등 입 니 다.그러나 session 의 특성 을 바탕 으로 정상 적 인 업무 처 리 를 지원 할 수 있 지만 필요 한 준 비 를 해 야 합 니 다.
로그 인 인증
post 방식 으로 데 이 터 를 제출 합 니 다.
md5 (uniqid (rand (), TRUE) 와 같은 token 토 큰 을 구성 하면 실효 시간 을 설정 할 수 있 습 니 다.
referer, 동원 정책 계획 검증
Api 권한 부여 등등.
서명 키 포함
key 와 sign 파 라 메 터 를 추가 하고 인증 과 파라미터 변경 문 제 를 해결 하 며 비밀 키 가 유출 되 지 않도록 요청 합 니 다.
대응 하 는 키, 시 크 릿 분배
서명 생 성 규칙
요청 매개 변수 에 시간 스탬프 timestamp 를 추가 하면 요청 이 만 료 되 었 는 지 확인 할 수 있 습 니 다.
$secret 를 암호 화하 여 사용 합 니 다. 데이터 안전 을 위해 요청 매개 변수 에 나타 나 지 마 십시오.
업그레이드 최적화
안전 이 상대 적 으로 높 은 시스템 에 있어 서명 회 는 자신 이 지정 한 복잡 한 규칙 을 사용 하고 header, body 는 모두 해당 하 는 처 리 를 한다.예 를 들 어 기업 메시지, 전자 주문 정보 등 이다.
데이터 암호 화 / 인 코딩 알고리즘 목록
1. 상용 키 알고리즘
키 알고리즘 은 민감 한 데이터, 요약, 서명 등 정 보 를 암호 화 하 는 데 사 용 됩 니 다. 자주 사용 하 는 키 알고리즘 은 다음 과 같 습 니 다.
DES (Data Encryption Standard): 데이터 암호 화 기준 으로 속도 가 빠 르 고 대량의 데 이 터 를 암호 화 하 는 장소 에 적 용 됩 니 다.
3DES (Triple DES): DES 를 기반 으로 한 데 이 터 를 세 개의 서로 다른 키 로 세 번 암호 화하 여 강도 가 높 습 니 다.
RC2 와 RC4: 길 어 지 는 키 로 대량의 데 이 터 를 암호 화하 여 DES 보다 빠르다.
IDEA (International DataEncryption Algorithm) 국제 데이터 암호 화 알고리즘 은 128 비트 키 를 사용 하여 매우 강 한 안전성 을 제공 합 니 다.
RSA: RSA 회사 에서 발명 한 키 가 길 어 지 는 것 을 지원 하 는 공공 키 알고리즘 입 니 다. 암호 화 되 어야 할 파일 의 빠 른 길이 도 가 변 적 입 니 다.
DSA (Digital Signature Algorithm): 디지털 서명 알고리즘 은 표준 DSS (디지털 서명 표준) 입 니 다.
AES (Advanced Encryption Standard): 고급 암호 화 기준 은 차세 대 암호 화 알고리즘 기준 으로 속도 가 빠 르 고 안전 등급 이 높 습 니 다. 현재 AES 표준 의 실현 은 Rijndael 알고리즘 입 니 다.
BLOWFISH 는 길 어 지 는 키 를 사용 합 니 다. 길 이 는 448 비트 에 달 하고 운행 속도 가 빠 릅 니 다.
ElGamal, Deffie - Hellman, 신형 타원 곡선 알고리즘 ECC 등 다른 알고리즘.
2. 단 방향 산열 알고리즘
단 방향 산열 함 수 는 일반적으로 메시지 요약, 키 암호 화 등에 사 용 됩 니 다. 흔히 볼 수 있 는 것 은:
MD5 (Message Digest Algorithm 5): RSA 데이터 보안 회사 가 개발 한 단 방향 해시 알고리즘 으로 MD5 가 광범 위 하 게 사용 되 고 서로 다른 길이 의 데이터 블록 을 암호 로 128 비트 의 수치 로 연산 할 수 있 습 니 다.
SHA (Secure Hash Algorithm) 는 새로운 해시 알고리즘 으로 임의의 길이 의 데이터 연산 에 160 비트 의 수 치 를 생 성 할 수 있 습 니 다.
MAC (Message Authentication Code): 메시지 인증 코드 는 키 를 사용 하 는 단 방향 함수 로 시스템 이나 사용자 간 에 파일 이나 메 시 지 를 인증 할 수 있 습 니 다.HMAC (메시지 인증 에 사용 되 는 키 해시 법) 가 바로 이러한 함수 의 한 예 입 니 다.
CRC (Cyclic Redundancy Check): 순환 중복 검사 코드, CRC 검 사 는 간단 하고 오류 검사 능력 이 강하 기 때문에 각종 데이터 검사 응용 에 널리 사용 된다.시스템 자원 을 적 게 차지 하고 소프트 하드웨어 로 모두 실현 할 수 있 으 며 데이터 전송 오류 검 사 를 하 는 좋 은 수단 입 니 다. (CRC 는 엄격 한 의미 의 해시 알고리즘 이 아니 지만 그 역할 은 해시 알고리즘 과 대체적으로 같 기 때문에 이러한 것 으로 귀 속 됩 니 다)
3. 기타 데이터 알고리즘
기타 데이터 알고리즘 은 Base 64, Quoted Printable, EBCDIC 등 상용 인 코딩 알고리즘 과 명문 (ASCII, Unicode 등) 변환 등 을 포함한다.예시 코드, 참고 만 제공:
/**  
  *         
  * @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; } }

만약 당신 이 더 좋 은 소감 과 건 의 를 가지 고 있다 면, 벽돌 을 치 며 함께 토론 하 는 것 을 환영 합 니 다.위 챗 공식 번호 [프로 그래 밍 기술 마이크로 공유] 를 검색 하여 대중 번호 에 관심 을 가 지 는 것 을 환영 합 니 다![프로 그래 밍 기술 마이크로 공유] 가입 을 환영 합 니 다. 가입 (596888158) 은 메 시 지 를 남기 거나 QQ: Mr. Chen (1182929304) 에 게 연락 하 십시오.

좋은 웹페이지 즐겨찾기