>  기사  >  백엔드 개발  >  실제 서명을 추가하고 확인하기 위해 Java와 PHP 도킹의 예

실제 서명을 추가하고 확인하기 위해 Java와 PHP 도킹의 예

墨辰丷
墨辰丷원래의
2018-05-30 14:53:521625검색

이 글은 주로 Java를 이용한 실제 서명 검증 사례를 소개하고 있으니, 관심 있는 친구들이 참고하시면 좋을 것 같습니다.

제가 구현한 방법은 주로 java에서 생성된 키를 php에서 인식할 수 있는 pem 형식의 키로 변환하는 것입니다. 기타 서명 및 검증은 openssl에 내장된 서명 메서드를 호출하여 수행됩니다.

Java에서 생성된 키는 주로 문자열입니다. pem 형식 키는 다음 헤더와 꼬리의 파일 형식이 있는 64비트 라인이며, 그러면 PHP는 해당 pem 형식 문자열을 얻습니다.

pem 형식 키

-----BEGIN PUBLIC KEY-----
//64chars一行(多行)
-----END PUBLIC KEY-----
-----BEGIN RSA PRIVATE KEY-----
//64chars一行(多行)
-----END RSA PRIVATE KEY-----

1.java 키가 pem 형식 PHP 코드로 변환

/**
 * 将字符串格式公私钥格式化为pem格式公私钥
 * @param $secret_key
 * @param $type
 * @return string
 */
public static function format_secret_key($secret_key, $type){
  //64个英文字符后接换行符"\n",最后再接换行符"\n"
  $key = (wordwrap($secret_key, 64, "\n", true))."\n";
  //添加pem格式头和尾
  if ($type == 'pub') {
    $pem_key = "-----BEGIN PUBLIC KEY-----\n" . $key . "-----END PUBLIC KEY-----\n";
  }else if ($type == 'pri') {
    $pem_key = "-----BEGIN RSA PRIVATE KEY-----\n" . $key . "-----END RSA PRIVATE KEY-----\n";
  }else{
    echo('公私钥类型非法');
    exit();
  }
  return $pem_key;
}

2.서명 추가

/**
 * RSA加签
 * @param $paramStr
 * @param $priKey
 * @return string
 */
public static function sign($paramStr, $priKey){
  $sign = '';
  //将字符串格式公私钥转为pem格式公私钥
  $priKeyPem = SignUtil::format_secret_key($priKey, 'pri');
  //转换为openssl密钥,必须是没有经过pkcs8转换的私钥
  $res = openssl_get_privatekey($priKeyPem);
  //调用openssl内置签名方法,生成签名$sign
  openssl_sign($paramStr, $sign, $res);
  //释放资源
  openssl_free_key($res);
  //base64编码签名
  $signBase64 = base64_encode($sign);
  //url编码签名
  $sign = urlencode($signBase64);
  return $sign;
}

3. 서명 확인

/**
 * RSA验签
 * @param $paramStr
 * @param $sign
 * @param $pubKey
 * @return bool
 */
public static function verify($paramStr, $sign, $pubKey) {
  //将字符串格式公私钥转为pem格式公私钥
  $pubKeyPem = SignUtil::format_secret_key($pubKey, 'pub');
  //转换为openssl密钥,必须是没有经过pkcs8转换的公钥
  $res = openssl_get_publickey($pubKeyPem);
  //url解码签名
  $signUrl = urldecode($sign);
  //base64解码签名
  $signBase64 = base64_decode($signUrl);
  //调用openssl内置方法验签,返回bool值
  $result = (bool)openssl_verify($paramStr, $signBase64, $res);
  //释放资源
  openssl_free_key($res);
  //返回资源是否成功
  return $result;
}

이상이 이 글의 전체 내용이므로, 모든 분들의 공부에 도움이 되길 바랍니다.


관련 권장 사항:

PHP에서 IP 액세스를 제한하는 방법_phptips

PHP7 멀티 스레딩 튜토리얼

phpExcel 파일 데이터 가져오기 구현

위 내용은 실제 서명을 추가하고 확인하기 위해 Java와 PHP 도킹의 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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