>  기사  >  백엔드 개발  >  API 공통 서명 확인 방법(PHP 구현)

API 공통 서명 확인 방법(PHP 구현)

安安杰尼
安安杰尼원래의
2020-04-29 12:37:29199042검색

사용 시나리오

이제 점점 더 많은 프로젝트에서 개발을 위해 프런트엔드와 백엔드 분리 모델을 사용합니다. 백엔드 개발자는 API 인터페이스를 사용하여 처리 및 표시를 위해 프런트엔드 개발자에게 데이터를 전송합니다. 데이터 인터페이스에는 돈이 관련됩니다. 사용자 정보와 같은 수정된 인터페이스가 보호 및 검증되지 않으면 누군가가 인터페이스를 악의적으로 스와이프하여 막대한 손실을 초래하는 경우가 많습니다.

API 서명 확인

여기에서는 인터페이스의 매개변수를 암호화하기 위해 업계에서 보다 일반적인 서명 확인을 소개합니다. 이는 다음과 같은 장점이 있습니다.

  • 요청된 고유성: 계산된 서명은 고유하며 확인에 사용할 수 있습니다.

  • 매개변수의 가변성: 매개변수에는 타임스탬프 매개변수가 포함되어 있어 각 요청에 대해 계산된 서명이 서로 다르다는 것을 보장합니다.

  • 요청 적시성: 요청에 현재 요청의 타임스탬프 매개변수가 포함되어 있으므로 서버는 타임스탬프를 확인하고 시간 제한을 초과하는 요청을 필터링할 수 있습니다.

  • 보안: 요청을 악의적으로 캡처하고 매개변수를 악의적으로 변조하더라도 서명이 잘못되어 매개변수를 수정할 수 없습니다.

사실을 실천하세요

1. 서명할 데이터를 키 크기에 따라 맵 유형(예: 키-값 쌍 집합)으로 정렬합니다. 맵의 매개변수는 알파벳 순서로 정렬됩니다. 첫 글자가 동일하면 두 번째 글자로 정렬됩니다. 예를 들어

{
    "timestamp": "2017-06-08 09:38:00",
    "format": "xml",
    "app_id": "aabbc",
    "cp_extend_info": "",
    "sign_type": "HMAC-SHA1",
    "sign": "abc"
}

로 정렬한 후 정렬하면

{
    "app_id": "aabbc",
    "cp_extend_info": "",
    "format": "xml",
    "sign_type": "HMAC-SHA1",
    "timestamp": "2017-06-08 09:38:00"
}

가 됩니다. 참고: 지도에 서명 매개변수(sign)가 포함된 경우 해당 매개변수의 키 값을 필터링해야 하며 서명에 참여하지 않습니다. 매개변수에 값이 없으면 서명에 참여하지 마세요

2. 정렬된 맵을 서명할 문자열로 직렬화합니다. 서명할 연결 문자열은

app_id=aabbc&format=xml&sign_type=HMAC-SHA1&timestamp=2017-06-08 09:38:00

3. 키를 사용하여 다이제스트(해시)를 추출합니다. ) HMAC-SHA1 알고리즘에 따라 서명될 문자열의 서명 및 base64_encode 인코딩 수행(명시적 전송 및 비교용), 서명 키가 테스트라고 가정하고 추출된 다이제스트 서명 및 base64_encoded 값은

JqoEqPIVVor0eyRHMYiZftsycVo=

입니다. 참고: HTTP 프로토콜의 요구 사항으로 인해 일부 데이터는 네트워크를 통해 전송됩니다. 수신자가 올바른 매개변수를 수신할 수 있도록 프로세스 중에 URL 인코딩이 필요합니다. 그러나 이 매개변수가 서명에 포함된 경우 서명할 문자열은 다음과 같아야 합니다. URLencoding 값이 아닌 문자열의 원래 값입니다.

코드 연습

PHP 예제

/**
 * 使用密钥生成HMAC-Sha1签名
 * @param array $params 请求参数
 * @param string $signKey 签名密钥
 * @return string
 */
function hmacSha1Sign($params,$signKey)
{
    ksort($params);
 
    $paramString = '';
    foreach ($params as $key => $value) {
        if (is_null($value) || $value=='' || $key == 'sign') {
            continue;
        }
        $paramString .= $key.'='.$value.'&';
    }
    $paramString = substr($paramString,0,-1);
    $sign = base64_encode(hash_hmac("sha1", $paramString, $signKey, $raw_output=TRUE));
    return $sign;
}

위는 일상적인 개발에서 일반적으로 사용되는 API 확인 서명 방법입니다. 더 많은 튜토리얼을 보려면 매우 간단하고 유용합니다.

위 내용은 API 공통 서명 확인 방법(PHP 구현)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.