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 를 예 로 들 면
폭력 적 으로 해 소 될 가능성 이 있 으 므 로 소금 값 을 넣 는 방식 으로 안전성 을 높이 는 것 이 좋다.
응용 장면
사용자 비밀번호,요청 파라미터,파일 암호 화 등 민감 한 데이터 에 사용 합 니 다.
비밀번호 저장 방식 추천
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
대칭 암호 화
정의.
같은 키 는 데이터 의 암호 화 와 복호화 에 동시에 사용 할 수 있 습 니 다.이 방법 을 대칭 암호 화 라 고 합 니 다.
상용 알고리즘
장점.
알고리즘 공개,계 산 량 이 적 고 암호 화 속도 가 빠 르 며 암호 화 효율 이 높다.
결점.
발송 자 와 수신 자 는 키 를 합의 한 후에 쌍방 이 키 를 잘 저장 할 수 있 도록 해 야 합 니 다.키 관 리 는 쌍방의 부담 이 됩 니 다.
응용 장면
상대 적 으로 큰 데이터 양 이나 핵심 데이터 의 암호 화
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
해결 의 문제점:
사용 방법
인터페이스 개발 이 완료 되 었 습 니 다.요청 자 에 게 인터페이스 문 서 를 제공 해 야 합 니 다.문서 의 작성 은 현재 대부분 Markdown 형식 을 사용 하고 있 습 니 다.
자신의 서버 에 다운로드 하고 설치 할 수 있 는 오픈 소스 시스템 도 있다.
온라인 으로 사용 할 수 있 고 오프라인 내 보 내기 도 지원 하 는 온라인 시스템 도 있다.
자신의 상황 에 따라 자신 에 게 맞 는 문서 플랫폼 을 선택 하 세 요.
자주 사용 하 는 인터페이스 문서 플랫폼:
1.HTTP 와 RPC 의 선택 에 있어 의문 이 있 을 수 있 습 니 다.RPC 프레임 워 크 설정 이 복잡 합 니 다.분명히 HTTP 로 이 루어 질 수 있 는데 왜 RPC 를 선택해 야 합 니까?
다음은 간단하게 HTTP 와 RPC 의 차 이 를 소개 한다.
전송 프로 토 콜:
성능 소모:
홈 페이지 주소: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 는 타임 스탬프 알고리즘 을 기반 으로 한 일회 성 암호 입 니 다.
사용 필드:
본 고 는 디자인 서명 검증 이 만족 해 야 할 몇 가지 조건 을 말 했다.즉,가 변성,시효 성,유일 성,완전 성 이다.
또한 일부 암호 화 방법 도 말 했다.단 방향 해시 암호 화,대칭 암호 화,비대 칭 암호 화 는 각종 암호 화 방법의 장단 점 을 분 석 했 고 여러분 은 자신의 업무 특징 에 따라 자 유 롭 게 선택 할 수 있 습 니 다.
Aes,Rsa 관련 코드 예 시 를 제공 합 니 다.
인터페이스 문 서 를 작성 할 수 있 는 온라인 시스템 을 공유 했다.
개발 과정 에서 사용 되 는 인터페이스 디 버 깅 도 구 를 공유 했다.
확장 에 서 는 HTTP 와 RPC 의 차이 점,동적 토 큰 소개 등 을 분석 했다.
이상 은 PHP 인터페이스 서명 검증 에 대한 상세 한 내용 입 니 다.더 많은 PHP 인터페이스 서명 검증 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
laravel에 yo에서 angularJs&coffeescript를 사용할 수 있도록 한다.먼저 yo 명령을 사용할 수 있어야하므로 아래에서 설치 global에 설치한 곳에서 laravel의 프로젝트 루트로 이동. 클라이언트 코드를 관리하는 디렉토리를 만들고 이동합니다. 클라이언트 환경 만들기 이것으로 히...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.