>백엔드 개발 >PHP 튜토리얼 >PHP를 사용하여 RSA 서명, 암호화 및 확인을 통해 SHA1 구현

PHP를 사용하여 RSA 서명, 암호화 및 확인을 통해 SHA1 구현

little bottle
little bottle앞으로
2019-04-18 11:19:179550검색

인터넷에서 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;
    }

You 개인 키가 bin2hex()인 이유를 물어보면 공개 키가 base64_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 비디오 튜토리얼

위 내용은 PHP를 사용하여 RSA 서명, 암호화 및 확인을 통해 SHA1 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제