PHP 인터페이스 서명 검증

13780 단어 PHP서명 검증
개관
디자인 서명 검증 을 할 때 다음 과 같은 몇 가 지 를 만족 시 켜 야 합 니 다.
  • 가 변성:매번 서명 은 달라 야 합 니 다.
  • 실효 성:매번 요청 한 실효 성,기한 이 지나 면 폐기 합 니 다.
  • 유일 성:매번 서명 이 유일 합 니 다.
  • 완전 성:들 어 오 는 데 이 터 를 검증 하여 변경 을 방지 할 수 있 습 니 다.
  • 다음은 주로 업무 중 에 자주 사용 하 는 복호화 방법 을 공유 합 니 다.
    상용 검증
    예:/api/login?username=xxx&password=xxx&sign=xxx
    발송 자 와 수신 자 는 암호 화 된 소금 값 을 약속 하여 서명 을 생 성 합 니 다.
    예제 코드:
    
    //    
    private function _createSign()
    {
        $strSalt = '1scv6zfzSR1wLaWN';
        $strVal  = '';
        if ($this->params) {
            $params = $this->params;
            ksort($params);
            $strVal = http_build_query($params, '', '&', PHP_QUERY_RFC3986);
        }
        return md5(md5($strSalt).md5($strVal));
    }
    
    //    
    if ($_GET['sign'] != $this->_createSign()) {
        echo 'Invalid Sign.';
    }
    위 에서 MD5 방법 을 사 용 했 는데 MD5 는 단 방향 산열 암호 화 에 속한다.
    단 방향 해시 암호 화
    정의.
    임의의 긴 입력 문자열 을 고정된 긴 출력 문자열 로 바 꾸 고 출력 문자열 에서 입력 문자열 을 얻 기 어 려 운 방법 을 단일 해시 암호 화 라 고 합 니 다.
    상용 알고리즘
  • MD5
  • SHA
  • MAC
  • CRC
  • 장점.
    MD5 를 예 로 들 면
  • 저장 하기 편리 함:암호 화 후 고정 크기(32 비트)의 문자열 로 고정 크기 의 공간 저장 소 를 할당 할 수 있 습 니 다.
  • 손실 이 낮 음:암호 화/암호 화 는 성능 에 대한 손실 이 매우 적다.
  • 파일 암호 화:32 개의 문자열 만 있 으 면 커 다란 파일 의 완전 성 을 검증 할 수 있 습 니 다.
  • 불가 역:대부분의 경우 불가 역,양호 한 안전성 을 가지 고 있 습 니 다.
  • 결점.
    폭력 적 으로 해 소 될 가능성 이 있 으 므 로 소금 값 을 넣 는 방식 으로 안전성 을 높이 는 것 이 좋다.
    응용 장면
    사용자 비밀번호,요청 파라미터,파일 암호 화 등 민감 한 데이터 에 사용 합 니 다.
    비밀번호 저장 방식 추천
    password_hash()는 충분 한 강도 의 단 방향 해시 알고리즘 을 사용 하여 암 호 를 만 드 는 해시(hash)입 니 다.
    예제 코드:
    
    //    
    $password = '123456';
    $strPwdHash = password_hash($password, PASSWORD_DEFAULT);
    
    //    
    if (password_verify($password, $strPwdHash)) {
      //Success
    } else {
      //Fail
    }
    PHP 매 뉴 얼 주소:
    http://php.net/manual/zh/function.password-hash.php
    대칭 암호 화
    정의.
    같은 키 는 데이터 의 암호 화 와 복호화 에 동시에 사용 할 수 있 습 니 다.이 방법 을 대칭 암호 화 라 고 합 니 다.
    상용 알고리즘
  • DES
  • AES
  • AES 는 DES 의 업그레이드 버 전 으로 키 길이 가 길 고 선택 이 많 으 며 유연 하 며 안전성 이 높 고 속도 가 빠르다.
    장점.
    알고리즘 공개,계 산 량 이 적 고 암호 화 속도 가 빠 르 며 암호 화 효율 이 높다.
    결점.
    발송 자 와 수신 자 는 키 를 합의 한 후에 쌍방 이 키 를 잘 저장 할 수 있 도록 해 야 합 니 다.키 관 리 는 쌍방의 부담 이 됩 니 다.
    응용 장면
    상대 적 으로 큰 데이터 양 이나 핵심 데이터 의 암호 화
    AES
    AES 암호 화 라 이브 러 리 는 인터넷 에서 쉽게 찾 을 수 있 으 니 라 이브 러 리 의 mcrypt 에 주의 하 십시오.encrypt 와 mcryptdecrypt 방법!


    PHP 7.2 버 전에 서 버 림 받 았 습 니 다.새 버 전에 서 는 openssl 을 사용 합 니 다.encrypt 와 openssldecrypt 두 가지 방법.
    예제 코드(라 이브 러 리):
    
    class Aes
    {
        /**
         * var string $method      
         */
        protected $method;
    
        /**
         * var string $secret_key       
         */
        protected $secret_key;
    
        /**
         * var string $iv       
         */
        protected $iv;
    
        /**
         * var int $options
         */
        protected $options;
    
        /**
         *     
         * @param string $key       
         * @param string $method      
         * @param string $iv        
         * @param int    $options
         */
        public function __construct($key = '', $method = 'AES-128-CBC', $iv = '', $options = OPENSSL_RAW_DATA)
        {
            $this->secret_key = isset($key) ? $key : 'CWq3g0hgl7Ao2OKI';
            $this->method = in_array($method, openssl_get_cipher_methods()) ? $method : 'AES-128-CBC';
            $this->iv = $iv;
            $this->options = in_array($options, [OPENSSL_RAW_DATA, OPENSSL_ZERO_PADDING]) ? $options : OPENSSL_RAW_DATA;
        }
    
        /**
         *   
         * @param string $data      
         * @return string
         */
        public function encrypt($data = '')
        {
            return base64_encode(openssl_encrypt($data, $this->method, $this->secret_key, $this->options, $this->iv));
        }
    
        /**
         *   
         * @param string $data      
         * @return string
         */
        public function decrypt($data = '')
        {
            return openssl_decrypt(base64_decode($data), $this->method, $this->secret_key, $this->options, $this->iv);
        }
    }
    예제 코드:
    
    $aes = new Aes('HFu8Z5SjAT7CudQc');
    $encrypted = $aes->encrypt('     ');
    echo '   :     <br>   :', $encrypted, '<hr>';
    
    $decrypted = $aes->decrypt($encrypted);
    echo '   :', $encrypted, '<br>   :', $decrypted;
    실행 결과:

    비대 칭 암호 화
    정의.
    암호 화 와 복호화 에 두 개의 키 가 필요 합 니 다.이 두 개의 비밀 키 는 각각 공개 키(Public key)와 비밀 키(private key)입 니 다.이 방법 을 비대 칭 암호 화 라 고 합 니 다.
    상용 알고리즘
    RSA
    장점.
    대칭 암호 화 에 비해 안전성 이 좋 고 복호화 하려 면 서로 다른 키 가 필요 하 며 공개 키 와 비밀 키 는 서로 복호화 할 수 있 습 니 다.
    결점.
    암호 화 와 복호화 가 오래 걸 리 고 속도 가 느 려 서 소량의 데 이 터 를 암호 화 하 는 데 만 적합 합 니 다.
    응용 장면
    안전성 에 대한 요구 가 높 은 장면 에 적합 하고 소량의 데 이 터 를 암호 화 하 는 데 적합 하 다.예 를 들 어 결제 데이터,로그 인 데이터 등 이다.
    알고리즘 이름
    표준 이름
    비고
    RSA2
    SHA256WithRSA
    RSA 키 의 길 이 를 최소 2048 로 강제 합 니 다.
    RSA
    SHA1WithRSA
    RSA 키 의 길 이 를 제한 하지 않 습 니 다.2048 비트 이상 사용 하 는 것 을 추천 합 니 다.
    RSA 2 는 RSA 보다 더 강 한 안전 능력 을 가지 고 있다.
    개미 금 복,시 나 웨 이 보 는 모두 RSA 2 알고리즘 을 사용 하고 있다.
    공개 키 와 비밀 키 만 들 기:
    openssl genrsa -out private_key.pem 2048
    openssl rsa -in private_key.pem -pubout -out public_key.pem
    위의 명령 을 실행 하면 private 생 성key.pem 과 publickey.pem 두 파일.
    예제 코드(라 이브 러 리):
    
    class Rsa2 
    {
        private static $PRIVATE_KEY = 'private_key.pem   ';
        private static $PUBLIC_KEY  = 'public_key.pem   ';
    
        /**
         *     
         * @return bool|resource
         */
        private static function getPrivateKey()
        {
            $privateKey = self::$PRIVATE_KEY;
            return openssl_pkey_get_private($privateKey);
        }
    
        /**
         *     
         * @return bool|resource
         */
        private static function getPublicKey()
        {
            $publicKey = self::$PUBLIC_KEY;
            return openssl_pkey_get_public($publicKey);
        }
    
        /**
         *     
         * @param string $data
         * @return null|string
         */
        public static function privateEncrypt($data = '')
        {
            if (!is_string($data)) {
                return null;
            }
            return openssl_private_encrypt($data,$encrypted,self::getPrivateKey()) ? base64_encode($encrypted) : null;
        }
    
        /**
         *     
         * @param string $data
         * @return null|string
         */
        public static function publicEncrypt($data = '')
        {
            if (!is_string($data)) {
                return null;
            }
            return openssl_public_encrypt($data,$encrypted,self::getPublicKey()) ? base64_encode($encrypted) : null;
        }
    
        /**
         *     
         * @param string $encrypted
         * @return null
         */
        public static function privateDecrypt($encrypted = '')
        {
            if (!is_string($encrypted)) {
                return null;
            }
            return (openssl_private_decrypt(base64_decode($encrypted), $decrypted, self::getPrivateKey())) ? $decrypted : null;
        }
    
        /**
         *     
         * @param string $encrypted
         * @return null
         */
        public static function publicDecrypt($encrypted = '')
        {
            if (!is_string($encrypted)) {
                return null;
            }
            return (openssl_public_decrypt(base64_decode($encrypted), $decrypted, self::getPublicKey())) ? $decrypted : null;
        }
    
        /**
         *     
         * @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);
        }
    }
    예제 코드:
    
    $rsa2 = new Rsa2();
            
    $privateEncrypt = $rsa2->privateEncrypt('     ');
    echo '     :'.$privateEncrypt.'<br>';
    
    $publicDecrypt = $rsa2->publicDecrypt($privateEncrypt);
    echo '     :'.$publicDecrypt.'<br>';
    
    $publicEncrypt = $rsa2->publicEncrypt('     ');
    echo '     :'.$publicEncrypt.'<br>';
    
    $privateDecrypt = $rsa2->privateDecrypt($publicEncrypt);
    echo '     :'.$privateDecrypt.'<br>';
    
    $sign = $rsa2->createSign('     ');
    echo '    :'.$privateEncrypt.'<br>';
    
    $status = $rsa2->verifySign('     ', $sign);
    echo '    :'.($status ? '  ' : '  ') ;
    실행 결과:
    부분 데이터 캡 처 는 다음 과 같 습 니 다.

    JS-RSA
    JSENcrypt:OpenSSL RSA 암호 화,복호화,키 생 성 을 수행 하 는 자바 script 라 이브 러 리 입 니 다.
    Git 소스:https://github.com/travist/jsencrypt
    응용 필드:
    저 희 는 WEB 로그 인 기능 을 할 때 보통 Form 제출 이나 Ajax 방식 으로 서버 에 제출 하여 검증 합 니 다.
    스냅 백 을 방지 하기 위해 로그 인 비밀 번 호 는 반드시 암호 화(RSA)를 한 번 하고 서버 에 제출 하여 검증 해 야 한다.
    일부 대기업 들 은 타 오 바 오,경 동,시 나 닷 컴 등 을 사용 하고 있다.
    예제 코드 는 제공 되 지 않 습 니 다.Git 에서 제공 하 는 코드 는 매우 완벽 합 니 다.
    키 보안 관리
    이러한 암호 화 기술 이 안전 한 암호 화 효 과 를 얻 을 수 있 는 전 제 는 키 의 기밀 성 이다.
    실제 작업 에서 서로 다른 환경의 키 는 다 르 게 해 야 합 니 다(개발 환경,사전 발표 환경,정식 환경).
    그렇다면 키 를 어떻게 안전하게 저장 해 야 합 니까?
    환경 변수
    환경 변수 에 키 를 설정 하고 매번 환경 변수 에서 불 러 옵 니 다.
    배치 센터
    키 를 설정 센터 에 저장 하고 통일 적 으로 관리 합 니 다.
    키 만 료 정책
    키 유효기간 을 설정 합 니 다.예 를 들 어 한 달 에 한 번 리 셋 합 니 다.
    여기 서 큰 놈 이 새로운 아 이 디 어 를 내 줬 으 면 좋 겠 어 요.
    인터페이스 디 버 깅 도구
    Postman
    강력 한 웹 디 버 깅 과 웹 HTTP 요청 을 보 내 는 Chrome 플러그 인
    이것 은 더 소개 할 필요 가 없 으 니 모두 가 틀림없이 사용 한 적 이 있 을 것 이다.
    SocketLog
    Git 소스:https://github.com/luofei614/SocketLog
    해결 의 문제점:
  • 실행 중인 API 에 버그 가 있 습 니 다.파일 에 var 를 사용 할 수 없습니다.클 라 이언 트 호출 에 영향 을 줄 수 있 기 때문에 dump 디 버 깅 을 진행 합 니 다.파일 에 로 그 를 쓰 는 것 도 보기 가 쉽 지 않 습 니 다.
  • 우 리 는 두 번 째 로 새로운 시스템 을 개발 할 때 어떤 Sql 구문 과 프로그램의 warning,notice 등 오류 정 보 를 실 행 했 는 지 확인 하고 싶 습 니 다.
  • SocketLog 는 웹 소켓 을 통 해 디 버 깅 로 그 를 브 라 우 저의 console 에 출력 할 수 있 습 니 다.
    사용 방법
  • Chrome 플러그 인 설치,설정
  • SocketLog 서버 설치
  • PHP 에서 SocketLog 로 디 버 깅
  • 로그 형식 과 관련 매개 변 수 를 설정 합 니 다
  • 온라인 인터페이스 문서
    인터페이스 개발 이 완료 되 었 습 니 다.요청 자 에 게 인터페이스 문 서 를 제공 해 야 합 니 다.문서 의 작성 은 현재 대부분 Markdown 형식 을 사용 하고 있 습 니 다.
    자신의 서버 에 다운로드 하고 설치 할 수 있 는 오픈 소스 시스템 도 있다.
    온라인 으로 사용 할 수 있 고 오프라인 내 보 내기 도 지원 하 는 온라인 시스템 도 있다.
    자신의 상황 에 따라 자신 에 게 맞 는 문서 플랫폼 을 선택 하 세 요.
    자주 사용 하 는 인터페이스 문서 플랫폼:
  • eolinker
  • Apizza
  • Yapi
  • RAP2
  • DOClever
  • 넓히다
    1.HTTP 와 RPC 의 선택 에 있어 의문 이 있 을 수 있 습 니 다.RPC 프레임 워 크 설정 이 복잡 합 니 다.분명히 HTTP 로 이 루어 질 수 있 는데 왜 RPC 를 선택해 야 합 니까?
    다음은 간단하게 HTTP 와 RPC 의 차 이 를 소개 한다.
    전송 프로 토 콜:
  • HTTP 는 HTTP 프로 토 콜 을 기반 으로 합 니 다.
  • RPC 는 HTTP 프로 토 콜 도 가능 하고 TCP 프로 토 콜 도 가능 합 니 다.
  • HTTP 도 RPC 가 구현 하 는 방식 의 하나 다.
    성능 소모:
  • HTTP 는 대부분 JSON 을 기반 으로 이 루어 지 며 직렬 화 는 시간 과 성능 이 필요 합 니 다.
  • RPC 는 바 이 너 리 를 기반 으로 전송 할 수 있 으 며 소모 성능 이 적 습 니 다.
  • JSON 과 같 지만 JSON 전송 보다 빠 르 고 적은 신형 직렬 화 라 이브 러 리 Message Pack 을 추천 합 니 다.
    홈 페이지 주소:https://msgpack.org/
    서비스 관리,부하 균형 배치 의 차이 도 있다.
    사용 필드:
    예 를 들 어 브 라 우 저 인터페이스,앱 인터페이스,제3자 인 터 페 이 스 는 HTTP 를 추천 합 니 다.
    예 를 들 어 그룹 내부 의 서비스 호출 은 RPC 를 추천 합 니 다.
    RPC 는 HTTP 보다 성능 소모 가 적 고 전송 효율 이 높 으 며 서비스 관리 도 편리 하 다.
    추천 하 는 RPC 프레임 워 크:Thrift.
    2.동적 영패
    몇 가지 동적 토 큰 을 간단하게 소개 하고 관심 있 는 것 은 깊이 이해 할 수 있 습 니 다.
    OTP:One-Time Password 일회용 비밀번호.
    HOTP:HMAC-based One-Time Password 는 HMAC 알고리즘 을 기반 으로 암호 화 된 일회용 비밀번호 입 니 다.
    TOPP:Time-based One-Time Password 는 타임 스탬프 알고리즘 을 기반 으로 한 일회 성 암호 입 니 다.
    사용 필드:
  • 회사 VPN 로그 인 이중 요소 검증
  • 서버 로그 인 동적 암호 검증
  • 인터넷 뱅 킹,인터넷 게임 의 실체 동적 구령 판
  • 은행 이체 동태 비밀번호
  • 작은 매듭
    본 고 는 디자인 서명 검증 이 만족 해 야 할 몇 가지 조건 을 말 했다.즉,가 변성,시효 성,유일 성,완전 성 이다.
    또한 일부 암호 화 방법 도 말 했다.단 방향 해시 암호 화,대칭 암호 화,비대 칭 암호 화 는 각종 암호 화 방법의 장단 점 을 분 석 했 고 여러분 은 자신의 업무 특징 에 따라 자 유 롭 게 선택 할 수 있 습 니 다.
    Aes,Rsa 관련 코드 예 시 를 제공 합 니 다.
    인터페이스 문 서 를 작성 할 수 있 는 온라인 시스템 을 공유 했다.
    개발 과정 에서 사용 되 는 인터페이스 디 버 깅 도 구 를 공유 했다.
    확장 에 서 는 HTTP 와 RPC 의 차이 점,동적 토 큰 소개 등 을 분석 했다.
    이상 은 PHP 인터페이스 서명 검증 에 대한 상세 한 내용 입 니 다.더 많은 PHP 인터페이스 서명 검증 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

    좋은 웹페이지 즐겨찾기