PHP SHA1withRSA 암호 화 생 성 서명 및 검사

최근 에 회사 가 XX 제3자 결제 플랫폼 을 연결 하 는 대리 업 무 는 상대방 회사 가 JAVA 의 demo 만 있 기 때문에 문서 에 따라 PHP 의 서명 암호 화 를 자체 적 으로 통합 할 수 밖 에 없다.인터넷 에서 몇 가지 방법 을 찾 아 여러 가지 구 덩이 를 밟 았 는데 다행히 마지막 에 해결 한 셈 이다.말 이 많 지 않 고 코드 를 공유 했다.
업무 요구:각 서명 조립의 내용 은 필드 이름 의 사전 순서에 따라 정렬 하여 연 결 됩 니 다
먼저 서명 할 내용 을 조립 합 니 다:

/**
   *          
   * Author: Tao.
   *
   * @param array $data         
   * 
   * @return string
   */   
  public static function getSign($data)
  {
    foreach ($data as $k => $v) {
      $Parameters[$k] = $v;
    }
    //        
    ksort($Parameters);
    $sign = '';
    foreach ($Parameters as $k => $v) {
      $sign .= $k . "=" . $v . "&";
    }
    $sign = '&' . rtrim($sign, '&');
    return $sign;
  }
서명 문자열 은 다음 과 같 습 니 다.
&amount=amount 값&ccy=ccy 값&merchantId=merchantId 값&notifyUrl=notifyUrl 값&orderId=orderId 값&payeeAcctNo=payeeAcctNo 값(명문).
주의해 야 할 것 은 업무 수요 에 따라 서명 내용 전에 맞 춤 형&부 호 를 선택 할 지 여부 입 니 다.
그리고 비밀 키 서명 생 성:

/**
   *     
   * Author: Tao.
   *
   * @param string $data            
   * @param $key       (.pfx  )
   * @param string $pwd     
   *
   * @return string
   */
  public static function SHA1withRSA($data, $key,$pwd)
  {
    openssl_pkcs12_read(file_get_contents($key), $certs, $pwd); 
    if (!$certs) return;
    $signature = '';
    openssl_sign($data, $signature, $certs['pkey']);
    return bin2hex($signature); 
  }
제3자 회사 에서 16 진법 으로 전환 을 요구 하면 수요 에 따라 bin2hex()또는 base 64 를 선택 할 수 있 습 니 다.encode()。
여기 서 주의해 야 할 것 은 업무 수요 에 따라 서명 후의 내용 이 대소 문자 에 민감 해 야 하 는 지 여부 다.
서명 한 내용 은 소문 자로 되 어 있 을 것 이 며,strtoupper()를 대문자 로 변환 할 수 있 습 니 다.
이상 은 모두 에 게 정 리 된 비밀 키 암호 화 방법 입 니 다.
그러나 이 업무 에 서 는 은행 카드 번 호 를 RSA 공개 키 로 암호 화해 야 합 니 다.
다음은 공개 키 를 얻 는 방법 입 니 다.
대상 플랫폼 인증 서 를 가 져 오 는 공개 키(.cer 파일)입 니 다.

/**
   *     
   * Author: Tao.
   *
   * @param $path //       (.cer  )
   *
   * @return mixed
   * @throws \Exception
   */
  public static function loadCert($path)
  {
    $file = file_get_contents($path);
    if (!$file) {
      throw new \Exception('loadx509Cert::file_get_contents ERROR');
    }

    $cert = chunk_split(base64_encode($file), 64, "
"); $cert = "-----BEGIN CERTIFICATE-----
" . $cert . "-----END CERTIFICATE-----
"; $res = openssl_pkey_get_public($cert); $detail = openssl_pkey_get_details($res); openssl_free_key($res); if (!$detail) { throw new \Exception('loadX509Cert::openssl_pkey_get_details ERROR'); } return $detail['key']; } /** * * Author: Tao. * * @param $pubPath // (.cer ) * @param string $bankCode // * * @return string */ public static function rsa_encode($bankCode,$pubPath) { $pubkey = self::loadCert($pubPath); $encrypt_data = ''; openssl_public_encrypt($bankCode, $encrypt_data, $pubkey); $encrypt_data = base64_encode($encrypt_data); return $encrypt_data; }
왜 비밀 키 가 bin2hex()인지 물 어보 시 겠 습 니까?공개 키 가 base 64 로 바 뀌 었 습 니 다.encode()。왜 그런 지 모 르 겠 어 요.16 분 이 라 고 물 어 봤 는데 사인 요청 이 계속 실 패 했 고 64 로 바 뀌 었 어 요.상대방 은 문서 가 너무 낡 아서 잊 어 버 렸 다 고 말 했다.필요 에 따라 선택 하 세 요.
마지막 리 셋 결과 체크
우선 리 셋 데이터 에서 서명 필드 를 조립 한 내용 을 추출 하고 위의 getSign()방법 에 따라 정렬 합 니 다.
그리고 검증:

/**
   *            
   *
   * @param string $data         
   * @param string $signature     
   *@param $pubPath        (.cer  )
   *
   * @return bool
   */
  public static function verifyRespondSign($data, $signature,$pubPath)
  {
    $keys = self::loadCert($pubPath);
    $signature = hex2bin($signature);
    $ok = openssl_verify($data, $signature, $keys);
    if ($ok == 1) {
      return true;
    }
    return false;
  }
위 에서 말 한 것 은 편집장 이 여러분 에 게 소개 한 PHP SHA1withRSA 암호 화,서명 및 서명 의 모든 내용 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 저 에 게 메 시 지 를 남 겨 주세요.편집장 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기