현재 위치: > 최신 기사 목록> hash_final은 OpenSSL_Sign을 사용하여 디지털 서명을 어떻게 완료합니까?

hash_final은 OpenSSL_Sign을 사용하여 디지털 서명을 어떻게 완료합니까?

gitbox 2025-05-26

PHP에서 디지털 서명은 데이터 무결성 및 신원 인증을 보장하는 중요한 수단입니다. 데이터를 소화하고 개인 키로 다이제스트를 암호화함으로써 발신자는 데이터가 실제로 전송되고 전송 중에 변조되지 않았 음을 증명할 수 있습니다. 이 기사는 Hash_FinalOpenSSL_SIGN 기능을 결합하여 완전한 디지털 서명 프로세스를 구현하는 방법을 자세히 설명합니다.

1. 기본 개념의 검토

1. 해시 시리즈 기능

PHP는 hash_init , hash_updatehash_final 을 포함하여 해시 다이제스트를 생성하기위한 일련의 기능을 제공합니다. 이러한 기능은 스트리밍 작업을 지원하며 대형 파일 또는 세그먼트에서 전송 된 데이터를 처리하는 데 적합합니다.

2. OpenSSL_Sign 함수

OpenSSL_SIGN은 개인 키를 사용하여 데이터에 서명하여 돌이킬 수없는 암호화 다이제스트를 생성합니다. 서명 된 데이터는 공개 키를 사용하여 확인할 수 있습니다.

2. 서명 프로세스 단계

우리는 더 큰 문자열 내용에 디지털로 서명해야한다고 가정 할 때 간단한 시나리오에서 시연 할 것입니다.

1. 해시 컨텍스트를 초기화합니다

 $context = hash_init('sha256');

여기에서 SHA-256 알고리즘을 사용합니다. 실제 요구에 따라 다른 알고리즘을 선택할 수도 있습니다.

2. 세그먼트의 데이터 업데이트 (빅 데이터 처리 시뮬레이션)

 $dataParts = [
    '첫 번째 단락,아마 업로드 된 파일의 일부에서。',
    '두 번째 단락,아마도 스트리밍 또는 로깅의 일부일 것입니다。',
    '마지막 단락,완전한 데이터 블록을 구성합니다。'
];

foreach ($dataParts as $part) {
    hash_update($context, $part);
}

이 코드는 빅 데이터의 처리 방법을 시뮬레이션하고 한 번에 메모리를 읽을 수없는 시나리오에 적합한 Hash_upDate 세그먼트를 통해 데이터를 추가합니다.

3. 최종 요약을 생성합니다

 $finalDigest = hash_final($context, true); // 원래 바이너리 형식 사용

두 번째 매개 변수를 true 로 설정하여 16 진수 문자열이 아닌 서명에 대한 원래 바이너리 데이터를 얻을 수 있습니다.

4. 개인 키로 서명하십시오

 $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).

5. 서명을 안전하게 전송하거나 저장하십시오

URL, JSON 또는 기타 비 이진 채널에서 쉽게 전송하기 위해 서명을 인코딩 할 수 있습니다.

 $encodedSignature = base64_encode($signature);
echo "서명: " . $encodedSignature;

3. 서명 검증 (선택 사항)

서명을 확인하기 위해 해당 공개 키 및 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 "검증 프로세스에서 오류가 발생했습니다";
}

4. 요약

hash_init / hash_update / hash_finalOpenSSL_SIGN 을 결합하면 유연하고 안전한 디지털 서명 메커니즘을 구현할 수 있습니다. 이 방법은 특히 빅 데이터를 세그먼트로 처리 해야하는 시나리오에 적합합니다. 전송 중에 개인 키와 서명 된 데이터의 보안을 보호하고 시스템의 전체 신뢰 체인이 파괴되지 않도록하는 것을 잊지 마십시오.