PHP에서 Hash_final은 해시 컨텍스트의 일부이며 해시 계산을 완료하고 최종 다이제스트를 반환하는 데 사용됩니다. 보안 사례는 OpenSSL 시리즈 기능 (예 : OpenSSL_encrypt , OpenSSL_DECRYPT , OPENSSL_SIGN 등)과 함께 사용할 때 특히 중요합니다. 이 기사는이 두 가지 도구를 안전하게 결합하고 일반적인 함정을 피하고 안전한 코드 예제를 제공하는 방법으로 뛰어납니다.
Hash_final 은 Hash_init 및 Hash_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 (초기화 벡터)가 엄격하게 길이 바이너리 데이터임을 요구하기 때문입니다.
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
완전한 보안 예 : 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