>  기사  >  php教程  >  PHP openssl 암호화 확장 사용 요약

PHP openssl 암호화 확장 사용 요약

高洛峰
高洛峰원래의
2016-12-23 17:54:241132검색

소개

인터넷 발전의 역사에서 보안은 항상 개발자가 매우 중요하게 생각하는 주제였습니다. 데이터 전송 보안을 달성하려면 다음을 보장해야 합니다. -위조된 요청), 데이터 무결성(수정되지 않음), 데이터 개인 정보 보호(암호화된 텍스트, 직접 읽을 수 없음) 등 SSL/TLS 프로토콜에 의해 구현된 HTTPS 프로토콜이 이미 있지만 이는 클라이언트의 브라우저의 올바른 구현에 의존하며 매우 비효율적입니다. 따라서 일반적인 민감한 데이터(예: 거래 결제 정보 등)에는 여전히 우리가 필요합니다. 암호화 방법을 사용하여 수동으로 암호화합니다.

일반 WEB 개발자가 일부 기본 보안 관련 기술에 대해 깊이 이해할 필요는 없지만 암호화의 기본을 배우고 기존 암호화 관련 도구를 사용할 필요가 있습니다. 업무상의 필요로 인해 암호화 관련 글을 몇 편 읽고 제 경험을 바탕으로 이 글을 완성했습니다.

암호화 기초

암호화 사용법을 배우기 전에, 암호화와 관련된 몇 가지 기본 지식을 이해해야 합니다.

암호화 알고리즘은 일반적으로 대칭 암호화 알고리즘과 비대칭 암호화 알고리즘의 두 가지 유형으로 구분됩니다.

대칭 암호화

대칭 암호화 알고리즘은 메시지를 보내는 사람과 받는 사람이 동일한 키를 사용하여 파일을 암호화하고, 받는 사람은 동일한 키를 사용하여 파일을 암호화합니다. 정보를 해독하고 얻습니다. 일반적인 대칭 암호화 알고리즘은 des/aes/3des입니다.

대칭 암호화 알고리즘의 특징은 빠르며 암호화 전후에 파일 크기가 크게 변하지 않지만 키 저장이 큰 문제입니다. 왜냐하면 메시지를 보낸 사람 중 한 쪽의 키가 분실되면 정보 전송이 안전하지 않게 되기 때문입니다.

비대칭 암호화

대칭 암호화의 반대말은 비대칭 암호화입니다. 비대칭 암호화의 핵심 아이디어는 공개 키와 개인 키로 나누어진 한 쌍의 상대 키를 사용하는 것입니다. 개인키 자체를 안전하게 보관하고 공개키를 공개합니다. 공개 키와 개인 키는 한 쌍입니다. 공개 키를 사용하여 데이터를 암호화하면 해당 개인 키만 사용하여 데이터를 암호화할 수 있고, 개인 키를 사용하여 데이터를 암호화하면 해당 공개 키만 사용할 수 있습니다. 그것을 해독하는 데 사용할 수 있습니다. 데이터를 보내기 전에 수신자의 공개 키를 사용하여 데이터를 암호화하세요. 일반적인 비대칭 암호화 알고리즘에는 RSA/DSA가 포함됩니다.

비대칭 암호화에는 키 저장 문제가 없지만 많은 양의 계산이 필요하고 암호화 속도가 매우 느립니다. 암호화.

디지털 서명

데이터의 무결성을 보장하기 위해서는 해시 함수를 통해 해시 값을 계산해야 합니다. 이 해시 값을 디지털 서명이라고 합니다. 특징은 다음과 같습니다.

•원본 데이터의 크기에 관계없이 결과의 길이는 동일합니다.
•입력도 동일하고 출력도 동일합니다.
• 입력 내용을 조금만 변경하면 결과가 크게 달라집니다.
•암호화 프로세스는 되돌릴 수 없으며 해시 값을 통해 원본 데이터를 얻을 수 없습니다.

일반적인 디지털 서명 알고리즘에는 md5가 포함됩니다. , hash1 및 기타 알고리즘.

PHP의 openssl 확장

openssl 확장은 암호화 및 복호화와 관련된 여러 PHP 기능을 캡슐화하는 openssl 암호화 확장 패키지를 사용하여 데이터의 암호화 및 복호화를 크게 촉진합니다. 일반적으로 사용되는 기능은 다음과 같습니다.

대칭 암호화 관련:

string openssl_encrypt(string $data, string $method, string $password)

여기서 $data는 무엇입니까? 암호화된 데이터, $method는 암호화에 사용되는 방법이고, $password는 사용되는 키이며, 함수는 암호화된 데이터를 반환합니다.

$method 목록은 openssl_get_cipher_methods()를 사용하여 얻을 수 있습니다. 그 중 하나를 선택하고 사용하면 $method 목록의 형식은 다음과 같습니다.

Array(
  0 => aes-128-cbc,  // aes加密
  1 => des-ecb,    // des加密
  2 => des-ede3,   // 3des加密
  ...
  )


복호화 기능은 string openssl_encrypt( string $data , string $method , string $password)

비대칭 암호화 관련:

openssl_get_publickey();openssl_pkey_get_public();   // 从证书导出公匙;
openssl_get_privatekey();openssl_pkey_get_private();  // 从证书导出私匙;


모두 전달하면 됩니다. 인증서 파일(일반적으로 .pem 파일) ;

openssl_public_encrypt(string $data , string &$crypted , mixed $key [, int $padding = OPENSSL\_PKCS1\_PADDING ] )


공개 키를 사용하여 데이터를 암호화합니다. 여기서 $data는 $crypted는 암호화 후 참조 변수입니다. $key는 전달될 공개 키 데이터입니다. 왜냐하면 암호화된 데이터가 그룹화될 때 정확히 정수 배수가 아닐 수 있기 때문입니다. 암호화 비트 수이므로 $padding이 필요합니다. $padding의 옵션에는 각각 PKCS1 패딩 또는 패딩 없음인 OPENSSL_PKCS1_PADDING, OPENSSL_NO_PADDING이 포함됩니다.

이 방법의 반대는 (입력 매개변수가 일관됨) ):

openssl_private_encrypt(); // 使用私匙加密;
openssl_private_decrypt(); // 使用私匙解密;
openssl_private_decrypt(); // 使用公匙解密;


서명 및 확인 기능도 있습니다:

bool openssl_sign ( string $data , string &$signature , mixed $priv_key_id [, mixed $signature_alg = OPENSSL_ALGO_SHA1 ] )
int openssl_verify ( string $data , string $signature , mixed $pub_key_id [, mixed $signature_alg = OPENSSL_ALGO_SHA1 ] )


서명 함수: $data는 서명할 데이터입니다. $signature는 서명 결과의 참조 변수입니다. $priv_key_id는 서명에 사용되는 개인 키입니다. 서명에 대한 알고리즘 목록은 다음 형식으로 openssl_get_md_methods()를 사용하여 얻을 수 있습니다.

array(
  0 => MD5,
  1 => SHA1,
  2 => SHA256,
  ...
)


서명 확인 기능: 반대 서명 기능은 개인 키에 해당하는 공개 키를 전달해야 한다는 점을 제외하고, 결과는 서명 확인 결과입니다. 1은 성공을 의미하고, 0은 실패를 의미하며, -1은 오류를 의미합니다. >

다음은 비대칭 암호화의 간단한 예입니다.

// 获取公匙
$pub_key = openssl_get_publickey('test.pem');
 
$encrypted = '';
// 对数据分块加密
for ($offset = 0, $length = strlen($raw_msg); $offset < $length; $offset += $key_size){ 
  $encryptedBlock = &#39;&#39;;
  $data = substr($raw_msg, $offset, $key_size)
  if (!openssl_public_encrypt($data, $encryptedBlock, $pub_key, OPENSSL_PKCS1_PADDING)){
    return &#39;&#39;;
  } else {
    $encrypted .= $encryptedBlock;
 }
 return $encrypted;

대칭 암호화는 매우 간단합니다. ssl_encrypt()를 사용하면 됩니다.

물론 일부 인터페이스에는 다양한 패딩, 암호화 블록 크기 등과 같은 요구 사항이 다를 수 있으며 이러한 사항은 사용자가 조정해야 합니다.

HTTP 프로토콜 위에서 데이터를 처리하기 때문에 데이터 암호화가 완료된 후 직접 전송할 수 있습니다. cURL 또는 SOAP 확장 방법을 사용하면 직접 요청할 수 있습니다. 인터페이스.

결론

암호화는 어려운 이론과 많은 개념이 포함된 매우 고급 주제입니다. WEB 개발자로서 기본 구현을 공부할 필요는 없지만 캡슐화 사용법을 배우는 것이 좋습니다. 이 방법은 우리의 발전에 매우 유익합니다. 기본 구현을 이해하는 것만으로도 알고리즘 등에 대한 새로운 이해를 얻는 데 도움이 될 수 있습니다.

위 PHP의 openssl 암호화 확장(권장) 사용에 대한 요약은 모두 편집자가 공유한 내용이므로 참고가 되셨으면 좋겠습니다. PHP 중국어 웹사이트를 지원해 주시길 바랍니다.

PHP의 openssl 암호화 확장 사용 요약과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

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