인터넷에서 PHP 전문가가 공유한 PHP 서명 암호화 코드를 보았습니다. 관심이 있으신 분은 꼭 들러보세요.
개념 설명:
SHA1 보안 해시 알고리즘은 주로 디지털 서명 표준에서 정의된 디지털 서명 알고리즘에 적용됩니다.
RSA는 현재 가장 영향력 있는 공개 키 암호화 알고리즘으로, 지금까지 알려진 대부분의 암호화 공격에 저항할 수 있으며 ISO에서 공개 키 데이터 암호화 표준으로 권장합니다.
SHA1WithRSA: 서명에는 SHA 알고리즘을 사용하고 암호화에는 RSA 알고리즘을 사용합니다.
비즈니스 요구 사항:
각 서명별로 정리된 내용을 필드 이름의 사전 오름차순으로 정렬하여 연결합니다.
필요한 내용을 정리합니다. 먼저 서명하세요:
/** * 拼接需要签名的内容 * 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 value&ccy=ccy value&merchantId=merchantId value¬ifyUrl=notifyUrl value&orderId=orderId value&payeeAcctNo=payeeAcctNo value (일반 텍스트).
비즈니스 요구에 따라 서명 내용 앞에 앰퍼샌드를 붙일지 여부를 선택할 수 있습니다.
그런 다음 비밀 키 서명을 생성합니다.
/** * 秘钥加密 * 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); }
타사에서 16진수로의 변환을 요구하므로 이에 따라 bin2hex() 또는 base64_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, "\n"); $cert = "-----BEGIN CERTIFICATE-----\n" . $cert . "-----END CERTIFICATE-----\n"; $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; }
최종 콜백 결과 서명 확인
먼저 콜백 데이터에 어셈블된 서명 필드의 내용을 꺼내고 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를 사용하여 RSA 서명, 암호화 및 확인을 통해 SHA1 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!