>백엔드 개발 >PHP 문제 >PHP에서 Sodium 암호화 확장 기능을 사용하는 방법

PHP에서 Sodium 암호화 확장 기능을 사용하는 방법

醉折花枝作酒筹
醉折花枝作酒筹앞으로
2021-06-17 17:28:312468검색

이 글에서는 PHP에서 Sodium 암호화 확장 기능을 사용하는 방법을 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.

PHP에서 Sodium 암호화 확장 기능을 사용하는 방법

PHP의 Sodium 암호화 확장 기능 이해하기

이것은 암호화 확장 시리즈의 마지막 기사이자 우리가 배우고 싶은 마지막 PHP 암호화 확장 기능이기도 합니다. Sodium의 등장 목적도 원래 암호화 확장 프로그램인 Mcrypt를 대체하는 것입니다. Mcrypt는 PHP 7.2부터 제거되었으며 PHP 7.1에서는 더 이상 사용되지 않는 것으로 표시되었습니다. 그러나 Sodium 확장의 응용 프로그램은 많지 않습니다. 대부분의 경우 OpenSSL을 사용하여 암호화 작업을 수행합니다. 동시에 Sodium 확장은 많은 기능을 제공하므로 이 기사에서는 이에 대해서만 설명합니다. 물론 가장 중요한 점은 이 확장에 대한 공식 문서조차도 대부분의 기능에 대한 매개변수 설명이 없고 검색을 통해 찾은 정보가 거의 없다는 것입니다.

Sodium 확장은 PHP7.2 이후 PHP 소스 코드와 함께 출시되었습니다. 성공적으로 설치하려면 컴파일할 때 --with-sodium만 추가하면 됩니다. PHP7.2 이전 버전이라면 이 확장기능을 별도로 설치해야 합니다. 동시에 운영 체제에 libsodium-devel 라이브러리도 설치해야 합니다.

AEAD_AES_256_GCM 암호화 및 복호화

첫 번째는 이 AEAD_AES_256_GCM 암호화 및 복호화 기능 기능의 적용입니다. WeChat 결제와 관련된 개발에는 이 방법을 사용하여 데이터를 암호화하는 인터페이스가 있으며, 공식 문서에는 Sodium 확장 라이브러리의 기능을 사용하는 PHP용 해독 방법도 제공됩니다. (기사 마지막 부분에 있는 참조 문서의 두 번째 링크를 참조하세요.)

$data = '测试加密'; // 原始数据
$nonce = random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES); // 加密证书的随机串,加密证书的随机串
$ad = 'fullstackpm'; // 加密证书的随机串
$kengen = sodium_crypto_aead_aes256gcm_keygen(); // 密钥

// 是否可用
echo sodium_crypto_aead_aes256gcm_is_available(), PHP_EOL; // 1

// 加密
$pem = sodium_crypto_aead_aes256gcm_encrypt($data, $ad, $nonce, $kengen);
var_dump($pem);
// string(28) "��VRw!�����f��l�O�tV=\x�"

// 解密
$v = sodium_crypto_aead_aes256gcm_decrypt($pem, $ad, $nonce, $kengen);
var_dump($v);
// string(12) "测试加密"

코드의 주석에는 관련 기능과 매개변수가 자세히 설명되어 있습니다. 이를 사용하여 WeChat 결제에서 암호를 해독할 때 광고, 키, nonce 등은 모두 WeChat에서 제공하며 여기서 데모로 모두 자체 생성 콘텐츠입니다.

sodium_crypto_aead_aes256gcm_encrypt() 암호화로 생성된 콘텐츠도 바이너리 콘텐츠이므로 상대적으로 매우 안전한 암호화 형태입니다.

메시지 서명

Sodium 확장 라이브러리는 데이터가 변조되었는지 여부를 확인하는 기능, 즉 정보에 대한 서명 비교를 수행하는 기능도 제공합니다.

// 信息签名
$key = sodium_crypto_auth_keygen(); // 生成随机签名密钥
$message = '测试认证签名';

// 生成签名
$signature = sodium_crypto_auth($message, $key);
var_dump($signature);
// string(32) "�B�
//                9���l�wn�x���ӛc�ܙ�u^j��"

// 验证签名
var_dump(sodium_crypto_auth_verify($signature, $message, $key));
// bool(true)

필요한 것은 간단한 무작위 서명 키뿐입니다. 그런 다음 서명 다이제스트를 원본 텍스트와 비교하여 전송 중에 데이터가 변조되었는지 여부를 확인합니다.

Hash

예, 읽으셨습니다. Sodium 확장 프로그램은 해시 암호화 기능 세트도 제공합니다. 그러나 그 사용은 좀 더 복잡하며 생성된 콘텐츠는 비밀번호 해싱 알고리즘에 의해 생성된 콘텐츠와 약간 비슷합니다. 그러나 이러한 해시 비밀번호를 생성하려면 비밀번호 해시 알고리즘에서 비밀번호_hash()를 사용하는 것이 좋습니다.

// Hash
$password = '测试Hash';
$hash = sodium_crypto_pwhash_str(
    $password,
    SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE, // 最大计算量
    SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE // 最大RAM量
);
var_dump($hash);
// string(97) "$argon2id$v=19$m=65536,t=2,p=1$VFfdNV4W0MFwLiLPdr9i6g$QDmd5sQToZANYTVEkPVTbPvbY7tuf1ALKU3IXrF44R0"

// 验证 Hash 信息
var_dump(sodium_crypto_pwhash_str_verify($hash, $password));
// bool(true)

요약

우리는 일반적으로 접하지 않을 수도 있지만 Sodium 확장 프로그램은 개발에 실용적인 응용 프로그램을 가지고 있습니다. WeChat은 데이터 암호화에 이 암호화 방법을 사용하므로 이에 대해 더 깊이 이해해야 합니다. . 그러나 우리는 공무원이 가능한 한 빨리 문서를 개선할 수 있기를 바랍니다. 그렇지 않으면 이 확장 세트의 내용을 체계적으로 배울 수 없습니다.

테스트 코드:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202008/source/PHP%E7%9A%84Sodium%E5%8A%A0%E5%AF%86%E6%89%A9%E5%B1%95%E5%87%BD%E6%95%B0%E4%BA%86%E8%A7%A3.php

추천 학습: php 비디오 튜토리얼

위 내용은 PHP에서 Sodium 암호화 확장 기능을 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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