>  기사  >  백엔드 개발  >  PHP에서 서명 알고리즘을 구현하기 위해 RSA와 결합된 MD5의 분석 예

PHP에서 서명 알고리즘을 구현하기 위해 RSA와 결합된 MD5의 분석 예

黄舟
黄舟원래의
2017-10-09 09:10:532113검색

이 글에서는 주로 PHP로 구현된 RSA 서명 알고리즘과 결합된 MD5를 소개하고, RSA와 결합된 md5를 사용하여 PHP로 구현한 서명 알고리즘의 관련 운영 기술을 예제 형식으로 분석합니다. RSA 대중을 위한 관련 지침도 함께 제공됩니다. 키와 개인키가 필요한 친구들은 다음을 참고하시면 됩니다

이 글의 예시는 PHP에서 구현된 RSA 서명 알고리즘과 결합된 MD5를 설명합니다. 참조를 위해 모든 사람과 공유하세요. 세부 사항은 다음과 같습니다.


<?php
class Md5RSA{
  /**
   * 利用约定数据和私钥生成数字签名
   * @param $data 待签数据
   * @return String 返回签名
   */
  public function sign($data=&#39;&#39;)
  {
    if (empty($data))
    {
      return False;
    }
    $private_key = file_get_contents(dirname(__FILE__).&#39;/rsa_private_key.pem&#39;);
    if (empty($private_key))
    {
      echo "Private Key error!";
      return False;
    }
    $pkeyid = openssl_get_privatekey($private_key);
    if (empty($pkeyid))
    {
      echo "private key resource identifier False!";
      return False;
    }
    $verify = openssl_sign($data, $signature, $pkeyid, OPENSSL_ALGO_MD5);
    openssl_free_key($pkeyid);
    return $signature;
  }
  /**
   * 利用公钥和数字签名以及约定数据验证合法性
   * @param $data 待验证数据
   * @param $signature 数字签名
   * @return -1:error验证错误 1:correct验证成功 0:incorrect验证失败
   */
  public function isValid($data=&#39;&#39;, $signature=&#39;&#39;)
  {
    if (empty($data) || empty($signature))
    {
      return False;
    }
    $public_key = file_get_contents(dirname(__FILE__).&#39;/rsa_public_key.pem&#39;);
    if (empty($public_key))
    {
      echo "Public Key error!";
      return False;
    }
    $pkeyid = openssl_get_publickey($public_key);
    if (empty($pkeyid))
    {
      echo "public key resource identifier False!";
      return False;
    }
    $ret = openssl_verify($data, $signature, $pkeyid, OPENSSL_ALGO_MD5);
    switch ($ret)
    {
      case -1:
        echo "error";
        break;
      default:
        echo $ret==1 ? "correct" : "incorrect";//0:incorrect
        break;
    }
    return $ret;
  }
}

첨부: Openssl 생성 인증서 및 공개 및 개인 키 획득 지침

1. RSA 방법

1을 설정합니다. CA 루트 인증서 1 ) RSA 디렉터리 생성 2) 다음 하위 디렉터리 certs, crl, newcerts 생성 3) RSA 디렉터리에서 다음 작업을 수행합니다:

echo 01 > serial
touch index.txt
openssl req -new -x509 -newkey rsa:1024 -keyout CA.key -out CA.pem(자체 서명된 CA 인증서 생성)

2. 클라이언트 인증서 요청

openssl req -new -newkey rsa:1024 -keyout ddmdd_a.key -out ddmdd_a.req(ddmdd_a에 대한 키 및 인증서 요청 생성, 참고: 여기에 입력된 사용자 정보는 CA 인증서 정보와 완전히 일치해야 합니다)
openssl rsa -in ddmdd_a.key -pubout -out ddmdd_a.pub(공개 키 내보내기)

3. 클라이언트가 인증서 발급

openssl ca -keyfile CA.key -cert CA.pem -in ddmdd_a.req -out ddmdd_a.pem -notext(CA 키와 인증서를 사용하여 ddmdd_a에 대한 인증서 ddmdd_a.pem 발급)
openssl ca -keyfile CA.key -cert CA.pem -in subca_rsareq.pem -out subca.pem -notext (보조 CA 인증서 발급)

4 인증서 형식 변환

openssl x509 -inform pem - 결과 -in ddmdd_a.pem -out ddmdd_a.der
openssl pkcs12 -export -in ddmdd_a.pem -inkey ddmdd_a_rsakey.pem -out ddmdd_a.pfx
openssl pkcs12 -in ddmdd_a.pfx -out ddmdd_a.pem
openss l rsa -in ddmdd_ a.key -out ddmdd_a_open .key(개인 키 비밀번호 삭제)

5. 인증서 해지 목록 생성

echo 01 > crlnumber
openssl ca -keyfile CA.key -cert CA.pem -revoke ddmdd_a.pem (CA .pem에서 인증서 ddmdd_a 취소)
openssl ca -gencrl -keyfile CA.key -cert CA.pem -out CA.crl(인증서 취소 목록 생성 또는 업데이트)

6 인증서 정보 보기

openssl x509 -in CA.pem - noout –text

2. DSA 방법

1. CA 루트 인증서 생성 1) DSA 디렉터리 생성 2) 다음 하위 디렉터리 certs, crl, newcerts 생성 3) 다음 작업을 수행합니다. DSA 디렉터리:

echo 01 > serial
touch index.txt
openssl dsaparam -out CA.para 1024(dsa 매개변수 파일 생성)
openssl req -new -x509 -newkey dsa:CA.para -keyout CA.key -out CA.pem(dsa 매개변수를 사용하여 자체 서명된 CA 인증서 생성)

2. 클라이언트 인증서 요청

openssl dsaparam -out ddmdd_b.para 1024(dsa 매개변수 파일 생성)
openssl req -new -newkey dsa: ddmdd_b.para -keyout ddmdd_b.key -out ddmdd_b.req (dsa 매개변수를 사용하여 ddmdd_b에 대한 키 및 인증서 요청을 생성합니다. 참고: 여기에 입력된 사용자 정보는 CA 인증서 정보와 완전히 일치해야 합니다.)
openssl dsa - ddmdd_b.key -pubout -out ddmdd_b.pub(공개 키 내보내기)

3. 고객을 위한 인증서 발급

openssl ca -keyfile CA.key -cert CA.pem -in ddmdd_b.req -out ddmdd_b.pem -notext (ddmdd_b 인증서 발급 시 CA 키와 인증서 사용 ddmdd_b.pem)

3. 공개키와 개인키 얻기

a) 위의 방법으로 인증서를 생성하면 공개키를 얻을 수 있습니다. 다음 명령을 통해 개인 키를 입력합니다.

공개 키 내보내기:

DSA 모드: openssl dsa -in ddmdd_b.key -pubout -out ddmdd_b.pub.pem

RSA 모드: openssl rsa -in ddmdd_a.key -pubout -out ddmdd_a.pub. pem

개인 키 내보내기:

openssl rsa -in server.key -text > private.pem

b) 공개 및 개인 키 직접 생성:

openssl genrsa -out private.pem 1024
openssl pkcs8 -nocrypt -topk8 -in private.pem -out pkcs8.pem
openssl rsa -pubout -in private.pem public.pem

위 내용은 PHP에서 서명 알고리즘을 구현하기 위해 RSA와 결합된 MD5의 분석 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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