現在の位置: ホーム> 最新記事一覧> HASH_FINALセキュリティプラクティスとOpenSSL関数と組み合わせて

HASH_FINALセキュリティプラクティスとOpenSSL関数と組み合わせて

gitbox 2025-05-19

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

1 ?? hash_finalの基本的な使用法を理解します

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

なぜバイナリに焦点を合わせるのですか? OpenSSLOpenSSL_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