현재 위치: > 최신 기사 목록> Hash_Final을 사용하여 서명을 생성 할 때 메시지의 무결성을 처리하는 방법은 무엇입니까?

Hash_Final을 사용하여 서명을 생성 할 때 메시지의 무결성을 처리하는 방법은 무엇입니까?

gitbox 2025-05-27

PHP에서 Hash_final은 Hash_initHash_update 와 함께 사용되는 중요한 기능입니다. 주로 데이터의 무결성을 확인하기 위해 해시 다이제스트 (즉, 서명)를 생성하는 데 사용됩니다. 이 기사는 Hash_Final을 올바르게 사용하여 서명을 생성하고 전송 또는 저장된 절차 중에 메시지의 무결성을 보장하는 방법을 자세히 설명합니다.

1 ??? hash_final 이란 무엇입니까?

Hash_final은 PHP가 제공하는 해시 확장의 함수이며, 단계별 해시 작업을 완료하고 결과를 반환하는 데 사용됩니다. 기본 워크 플로우는 다음과 같습니다.

  1. hash_init을 사용하여 해시 컨텍스트를 초기화하십시오.

  2. hash_update를 사용하여 데이터를 컨텍스트로 해시 해야하는 데이터를 추가하십시오 (큰 데이터 블록을 처리하기 위해 여러 번 호출 될 수 있음).

  3. Hash_Final을 사용하여 최종 해시 값 (서명)을 얻으십시오.

이 단계별 접근 방식은 전체 컨텐츠를 한 번에 메모리에로드 할 필요가 없기 때문에 큰 파일 또는 스트리밍 데이터를 처리하는 데 특히 적합합니다.

2 ?? 코드 예 : 서명을 생성하는 방법

메시지 서명을 시뮬레이션하는 간단한 예를 살펴 보겠습니다.

 <?php
$message = '서명이 필요한 메시지입니다';
$algo = 'sha256';

// 해시 컨텍스트를 초기화합니다
$context = hash_init($algo);

// 해시 컨텍스트를 업데이트하십시오,데이터를 여러 번 추가 할 수 있습니다
hash_update($context, $message);

// 최종 서명을 받으십시오(요약)
$signature = hash_final($context);

// 출력 서명
echo "징후: " . $signature . "\n";
?>

이 예에서는 SHA256 알고리즘을 사용하여 메시지의 다이제스트를 생성합니다. 출력은 16 진수 인코딩 된 해시 값으로, 수신 끝에서 메시지의 무결성을 확인하는 데 사용할 수 있습니다.

3 ???? 메시지 무결성을 보장하는 방법

서명을 생성하는 것만으로는 충분하지 않으며 키는 서명을 확인하는 방법입니다. 완전한 과정은 일반적으로 다음 단계로 구성됩니다.

1 ??? 보내다 :

  • 서명을 생성하십시오.

  • 메시지와 서명을 수신자에게 보냅니다.

2 ?? 수화기 :

  • 받은 메시지.

  • 동일한 알고리즘을 사용하여 메시지의 서명을 재생하십시오.

  • 수신 된 서명이 계산 된 서명과 일치하는지 비교하십시오.

코드 예제 (수신자 확인) :

 <?php
$received_message = '서명이 필요한 메시지입니다';
$received_signature = '发送端提供的징후';
$algo = 'sha256';

// 重新计算징후
$context = hash_init($algo);
hash_update($context, $received_message);
$calculated_signature = hash_final($context);

// 比较징후
if (hash_equals($received_signature, $calculated_signature)) {
    echo "메시지가 완료되었습니다,변조하지 않습니다。\n";
} else {
    echo "경고하다:메시지가 변조되었을 수 있습니다!\n";
}
?>

? 참고 : hash_equals를 사용하여 ==를 직접 사용하는 대신 서명을 비교하면 시간 공격을 방지 할 수 있습니다.

4 ?? 실제 사례 : 파일 다운로드 확인

사용자가 https://gitbox.net/download/file.zip 에서 파일을 다운로드하고 확인을위한 해시 값을 제공한다고 가정 해 봅시다.

 <?php
$file = 'file.zip';
$algo = 'sha256';

// 파일 스트리밍 열기
$context = hash_init($algo);
$handle = fopen($file, 'rb');

while (!feof($handle)) {
    $data = fread($handle, 8192);
    hash_update($context, $data);
}
fclose($handle);

// 获取文件的징후(해시 가치)
$hash = hash_final($context);

echo "링크 다운로드: https://gitbox.net/download/file.zip\n";
echo "파일 해싱(무결성을 확인하는 데 사용됩니다): $hash\n";
?>

다운로더는 동일한 알고리즘을 사용하여 다운로드 된 파일 해시 값을 계산하여 제공된 값과 일치하는지 확인하여 파일이 완료되고 변조되지 않은지 확인할 수 있습니다.