PHP에서 디지털 서명은 데이터 무결성 및 신원 인증을 보장하는 중요한 수단입니다. 데이터를 소화하고 개인 키로 다이제스트를 암호화함으로써 발신자는 데이터가 실제로 전송되고 전송 중에 변조되지 않았 음을 증명할 수 있습니다. 이 기사는 Hash_Final 과 OpenSSL_SIGN 기능을 결합하여 완전한 디지털 서명 프로세스를 구현하는 방법을 자세히 설명합니다.
PHP는 hash_init , hash_update 및 hash_final 을 포함하여 해시 다이제스트를 생성하기위한 일련의 기능을 제공합니다. 이러한 기능은 스트리밍 작업을 지원하며 대형 파일 또는 세그먼트에서 전송 된 데이터를 처리하는 데 적합합니다.
OpenSSL_SIGN은 개인 키를 사용하여 데이터에 서명하여 돌이킬 수없는 암호화 다이제스트를 생성합니다. 서명 된 데이터는 공개 키를 사용하여 확인할 수 있습니다.
우리는 더 큰 문자열 내용에 디지털로 서명해야한다고 가정 할 때 간단한 시나리오에서 시연 할 것입니다.
$context = hash_init('sha256');
여기에서 SHA-256 알고리즘을 사용합니다. 실제 요구에 따라 다른 알고리즘을 선택할 수도 있습니다.
$dataParts = [
'첫 번째 단락,아마 업로드 된 파일의 일부에서。',
'두 번째 단락,아마도 스트리밍 또는 로깅의 일부일 것입니다。',
'마지막 단락,완전한 데이터 블록을 구성합니다。'
];
foreach ($dataParts as $part) {
hash_update($context, $part);
}
이 코드는 빅 데이터의 처리 방법을 시뮬레이션하고 한 번에 메모리를 읽을 수없는 시나리오에 적합한 Hash_upDate 세그먼트를 통해 데이터를 추가합니다.
$finalDigest = hash_final($context, true); // 원래 바이너리 형식 사용
두 번째 매개 변수를 true 로 설정하여 16 진수 문자열이 아닌 서명에 대한 원래 바이너리 데이터를 얻을 수 있습니다.
$privateKey = file_get_contents('/path/to/private_key.pem');
$pkeyid = openssl_pkey_get_private($privateKey);
if (!$pkeyid) {
die('개인 키 로딩이 실패했습니다');
}
$signature = '';
if (!openssl_sign($finalDigest, $signature, $pkeyid, OPENSSL_ALGO_SHA256)) {
die('서명이 실패했습니다');
}
openssl_free_key($pkeyid);
여기서, 다이제스트는 OpenSSL_Sign을 통해 개인 키를 사용하여 서명되며 동일한 알고리즘이 지정됩니다 (SHA-256).
URL, JSON 또는 기타 비 이진 채널에서 쉽게 전송하기 위해 서명을 인코딩 할 수 있습니다.
$encodedSignature = base64_encode($signature);
echo "서명: " . $encodedSignature;
서명을 확인하기 위해 해당 공개 키 및 OpenSSL_VERIFY를 사용할 수 있습니다.
$publicKey = file_get_contents('https://gitbox.net/keys/public_key.pem');
$pubkeyid = openssl_pkey_get_public($publicKey);
$isValid = openssl_verify($finalDigest, base64_decode($encodedSignature), $pubkeyid, OPENSSL_ALGO_SHA256);
if ($isValid === 1) {
echo "서명 검증이 성공적이었습니다";
} elseif ($isValid === 0) {
echo "잘못된 서명";
} else {
echo "검증 프로세스에서 오류가 발생했습니다";
}
hash_init / hash_update / hash_final 과 OpenSSL_SIGN 을 결합하면 유연하고 안전한 디지털 서명 메커니즘을 구현할 수 있습니다. 이 방법은 특히 빅 데이터를 세그먼트로 처리 해야하는 시나리오에 적합합니다. 전송 중에 개인 키와 서명 된 데이터의 보안을 보호하고 시스템의 전체 신뢰 체인이 파괴되지 않도록하는 것을 잊지 마십시오.