PHPでは、 hash_finalはハッシュコンテキストの一部であり、ハッシュ計算を完了し、最終ダイジェストを返すために使用されます。セキュリティプラクティスは、暗号化、decryption、またはsignature of hensive Dataの署名を含むOpenSSLシリーズ関数( OpenSSL_ENCRYPT 、 OpenSSL_DECRYPT 、 OpenSSL_SIGNなど)で使用する場合に特に重要です。この記事では、これらの2つのツールを安全に組み合わせ、一般的な落とし穴を避け、安全なコードの例を提供する方法に飛び込みます。
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_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