현재 위치: > 최신 기사 목록> hash_final 보안 관행 OpenSSL 기능과 함께

hash_final 보안 관행 OpenSSL 기능과 함께

gitbox 2025-05-19

PHP에서 Hash_final은 해시 컨텍스트의 일부이며 해시 계산을 완료하고 최종 다이제스트를 반환하는 데 사용됩니다. 보안 사례는 OpenSSL 시리즈 기능 (예 : OpenSSL_encrypt , OpenSSL_DECRYPT , OPENSSL_SIGN 등)과 함께 사용할 때 특히 중요합니다. 이 기사는이 두 가지 도구를 안전하게 결합하고 일반적인 함정을 피하고 안전한 코드 예제를 제공하는 방법으로 뛰어납니다.

1 ??? Hash_Final의 기본 사용법을 이해하십시오

Hash_finalHash_initHash_update 와 함께 사용하여 단계별로 해시를 계산합니다.

 $context = hash_init('sha256');
hash_update($context, 'data part 1');
hash_update($context, 'data part 2');
$hash = hash_final($context);

? 알아채다 :

  • Hash_Final 이 호출되면 컨텍스트를 계속 업데이트하는 데 사용할 수 없습니다.

  • 결과 $ HASH는 실제 매개 변수를 전달하지 않는 한 이진 형태입니다.

예:

 $hash = hash_final($context, true); // raw binary

이진에 초점을 맞추는 이유는 무엇입니까? OpenSSL (예 : OpenSSL_encrypt )의 일부 기능은 키 또는 IV (초기화 벡터)가 엄격하게 길이 바이너리 데이터임을 요구하기 때문입니다.

2 ?? OpenSSL 기능과 안전하게 결합됩니다

hash_final을 사용하여 키 또는 IV를 생성하여 OpenSSL 로 전달하면 특별한주의를 기울여야합니다.

? 같은 길이를 보장하십시오

  • 예를 들어, AES-128에는 16 바이트 키가 필요합니다. SHA256이 있는 경우 Substr은 처음 16 바이트를 가로 채어야합니다.

? 원래 바이너리 모드를 사용하십시오

  • 기본 16 진출 출력 (64 바이트)을 키로 사용하지 마십시오. OpenSSL_encrypt에는 문자열이 아닌 실제 바이트 길이가 필요합니다.

예:

 $context = hash_init('sha256');
hash_update($context, 'my secret passphrase');
$rawKey = hash_final($context, true); // 32 bytes (sha256 output)

$key = substr($rawKey, 0, 16); // For AES-128
$iv = substr($rawKey, 16, 16); // Use next 16 bytes as IV

3 ???? 권장 보안 코드 관행

완전한 보안 예 : Hash_Final을 사용하여 키를 도출하고 OpenSSL_encrypt 와 함께 데이터를 암호화합니다.

 <?php

$passphrase = 'super_secret_password';
$data = 'Sensitive data to encrypt';

// Derive key + IV from passphrase
$context = hash_init('sha256');
hash_update($context, $passphrase);
$rawHash = hash_final($context, true); // 32 bytes

$key = substr($rawHash, 0, 16); // AES-128 key
$iv = substr($rawHash, 16, 16); // IV

// Encrypt data
$ciphertext = openssl_encrypt(
    $data,
    'AES-128-CBC',
    $key,
    OPENSSL_RAW_DATA,
    $iv
);

// Encode ciphertext for transport (e.g., base64)
$encoded = base64_encode($ciphertext);
echo "Encrypted: $encoded\n";

// Decrypt
$decoded = base64_decode($encoded);
$decrypted = openssl_decrypt(
    $decoded,
    'AES-128-CBC',
    $key,
    OPENSSL_RAW_DATA,
    $iv
);
echo "Decrypted: $decrypted\n";
?>

여기에 사용 된 URL (암호화 된 데이터를 전송 해야하는 경우)은 다음과 같습니다.

 https://gitbox.net/api/submit