【PHP8.x】MHASH_SHA512定数の使い方
MHASH_SHA512定数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
MHASH_SHA512定数は、PHPのmhash拡張機能において、SHA-512(Secure Hash Algorithm 512-bit)ハッシュアルゴリズムを指定するために使用される定数です。ハッシュ関数とは、任意の長さの入力データから、元のデータが少しでも変更されると全く異なる値になる固定長の短い「ハッシュ値」を生成する一方向の関数です。このハッシュ値は、データの指紋のようなものとして機能し、主にデータの改ざん検知や、パスワードなどの情報を安全に保存する目的で利用されます。
SHA-512は、数あるハッシュアルゴリズムの中でも特に強力でセキュリティが高いものの一つとして知られており、512ビットのハッシュ値を生成します。このMHASH_SHA512定数をmhash()関数などの関連する関数に渡すことで、開発者は明示的にSHA-512アルゴリズムを選択し、指定したデータに対するハッシュ値を計算させることができます。これにより、PHP 8環境下で信頼性の高いセキュリティ機能を実装する上で、データの完全性や機密性を確保するための重要な手段となります。セキュアなシステムを構築する上で、この定数の適切な理解と利用は非常に重要です。
構文(syntax)
1<?php 2echo MHASH_SHA512; 3?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
戻り値なし
戻り値はありません
サンプルコード
PHPでSHA-512ハッシュを計算する
1<?php 2 3/** 4 * 指定された文字列のSHA-512ハッシュを計算します。 5 * 6 * PHP 8において、SHA-512アルゴリズムによるハッシュ計算には 7 * hash()関数と文字列'sha512'を使用することが推奨されます。 8 * リファレンス情報にあるMHASH_SHA512定数は、PHPの旧mhash拡張で 9 * SHA-512アルゴリズムを指定するために用いられていましたが、 10 * PHP 8では非推奨または削除されているため、直接使用することは避けるべきです。 11 * 12 * @param string $data ハッシュ化する元の文字列 13 * @return string SHA-512ハッシュ値(128文字の16進数文字列) 14 */ 15function calculateSha512Hash(string $data): string 16{ 17 // hash()関数を使用して、SHA-512アルゴリズムでハッシュを計算します。 18 return hash('sha512', $data); 19} 20 21// サンプルとしてハッシュ化したい文字列 22$inputString = "Hello, system engineer beginner!"; 23 24// SHA-512ハッシュを計算 25$sha512Result = calculateSha512Hash($inputString); 26 27// 結果を出力 28echo "元の文字列: " . $inputString . PHP_EOL; 29echo "SHA-512ハッシュ: " . $sha512Result . PHP_EOL; 30 31?>
このPHPコードは、特定の文字列から「SHA-512ハッシュ値」を計算する方法を示しています。SHA-512ハッシュは、元のデータが少しでも変更されると全く異なる値になるため、データの同一性や完全性を確認する目的で広く利用される技術です。
リファレンス情報にあるMHASH_SHA512定数は、かつてPHPのmhash拡張でSHA-512アルゴリズムを指定するために用いられていました。しかし、PHP 8の環境では非推奨または削除されており、直接使用することは避けるべきです。
このサンプルコードでは、現在推奨されている方法として、hash()関数を利用しています。hash()関数は、第一引数にハッシュアルゴリズム名(例として'sha512')、第二引数にハッシュ化したい元の文字列を指定することで、そのハッシュ値を計算します。
calculateSha512Hash関数は、ハッシュ化したい文字列を$dataという引数として受け取ります。そして、hash('sha512', $data)によって計算されたSHA-512ハッシュ値を、128文字の16進数文字列として返します。
コードの最後では、"Hello, system engineer beginner!"という文字列を実際にハッシュ化し、その結果を出力することで、SHA-512ハッシュ計算の具体的な動作を確認できます。
このサンプルコードは、PHP 8でSHA-512ハッシュを計算する際の推奨される方法を示しています。特に注意すべき点は、リファレンス情報にあるMHASH_SHA512という定数が、PHPの旧mhash拡張に属し、PHP 8では非推奨または削除されているため、直接使用してはいけないことです。初心者が古い情報や定数に惑わされ、エラーの原因となることを避けるべきです。
現在のPHPでSHA-512ハッシュを安全かつ正確に計算するには、hash()関数を使い、第一引数にアルゴリズム名である文字列'sha512'を指定することが正しい方法です。この関数は将来のPHPバージョンでも安定して利用できるため、推奨される書き方を習慣づけましょう。常にPHPの公式ドキュメントで最新情報を確認する姿勢が重要です。
PHPでソルト付きSHA512ハッシュを生成する
1<?php 2 3/** 4 * ソルト付きSHA512ハッシュを生成します。 5 * 6 * PHP 8ではmhash拡張機能とそれに含まれるMHASH_SHA512定数は削除されています。 7 * 代わりに、より推奨されるhash拡張機能のhash()関数を使用してSHA512ハッシュを生成します。 8 * 9 * @param string $data ハッシュ化する文字列(例: パスワード)。 10 * @param ?string $salt ハッシュに使用するソルト。指定しない場合は、安全なランダムなソルトが自動生成されます。 11 * @return array{hash: string, salt: string} 生成されたハッシュと使用されたソルトを含む連想配列。 12 */ 13function generateSha512HashWithSalt(string $data, ?string $salt = null): array 14{ 15 // ソルトが指定されていない場合は、安全なランダムなソルトを生成します。 16 // random_bytes(16)は16バイトのランダムなバイナリデータを生成し、 17 // bin2hex()でそれを32文字の16進数文字列に変換します。 18 if ($salt === null) { 19 $salt = bin2hex(random_bytes(16)); 20 } 21 22 // 入力データ(例: パスワード)と生成または指定されたソルトを結合し、 23 // hash()関数でSHA512アルゴリズムを使用してハッシュを生成します。 24 // これはPHPの標準的なhash拡張機能を利用するため、PHP 8で推奨される方法です。 25 $hashedData = hash('sha512', $data . $salt); 26 27 return [ 28 'hash' => $hashedData, 29 'salt' => $salt, 30 ]; 31} 32 33// --- サンプルコードの使用例 --- 34 35// ハッシュ化したい元の文字列(例えば、ユーザーのパスワード) 36$originalString = 'MySuperSecretPassword123!'; 37 38// ソルト付きSHA512ハッシュを生成 39// ソルトが指定されていないため、関数内で新しいソルトが自動生成されます。 40$hashResult = generateSha512HashWithSalt($originalString); 41 42echo "元の文字列: " . $originalString . PHP_EOL; 43echo "生成されたソルト: " . $hashResult['salt'] . PHP_EOL; 44echo "生成されたSHA512ハッシュ: " . $hashResult['hash'] . PHP_EOL . PHP_EOL; 45 46// --- ハッシュの検証例 --- 47// 実際のアプリケーションでは、データベースなどに保存されたソルトとハッシュを使用します。 48 49// ユーザーがログイン時に入力したパスワード 50$userInputString = 'MySuperSecretPassword123!'; 51// データベースから取得した、このユーザーのソルトとハッシュ($hashResultに保存されたものと仮定) 52$storedSalt = $hashResult['salt']; 53$storedHash = $hashResult['hash']; 54 55// 入力されたパスワードと保存されたソルトを使ってハッシュを再計算 56// このとき、`generateSha512HashWithSalt` 関数に保存されたソルトを明示的に渡します。 57$recalculatedHash = generateSha512HashWithSalt($userInputString, $storedSalt)['hash']; 58 59// 再計算したハッシュとデータベースに保存されたハッシュを比較して検証 60if ($recalculatedHash === $storedHash) { 61 echo "パスワードは一致しました。(認証成功)" . PHP_EOL; 62} else { 63 echo "パスワードは一致しません。(認証失敗)" . PHP_EOL; 64} 65 66// 意図的に間違ったパスワードで試す 67$wrongInputString = 'WrongPassword456!'; 68$recalculatedWrongHash = generateSha512HashWithSalt($wrongInputString, $storedSalt)['hash']; 69 70if ($recalculatedWrongHash === $storedHash) { 71 echo "(誤り)間違ったパスワードが一致しました。" . PHP_EOL; 72} else { 73 echo "(正しい)間違ったパスワードは一致しません。" . PHP_EOL; 74} 75 76?>
このサンプルコードは、PHP 8で推奨される方法を用いて、ソルト付きSHA512ハッシュを生成します。以前使用されていたmhash拡張機能のMHASH_SHA512定数は、PHP 8で削除されています。そのため、代わりに標準のhash拡張機能に含まれるhash()関数を使用することが現在のベストプラクティスです。
generateSha512HashWithSalt関数は、引数$dataで渡された文字列(例:パスワード)をSHA512アルゴリズムでハッシュ化します。セキュリティを高めるために、オプションの引数$saltが指定されていない場合、関数内でrandom_bytesとbin2hexを使って安全なランダムソルトを自動生成します。実際のハッシュ生成は、入力データとソルトを結合し、hash('sha512', $data . $salt)として実行されます。
戻り値は、生成されたハッシュ値と使用されたソルトを含む連想配列です。この情報は、ユーザー認証などの際に、保存されたソルトとパスワードを用いてハッシュを再計算し、保存されているハッシュ値と一致するかを検証するために利用されます。これにより、元のパスワードがデータベースに保存されず、セキュリティが強化されます。
PHP 8以降では、mhash拡張機能およびMHASH_SHA512定数は削除されており、サンプルコードのようにhash()関数を使用するのが推奨されるSHA512ハッシュの生成方法です。パスワードなどの機密情報をハッシュ化する際は、総当たり攻撃を防ぐため、必ずソルト(salt)を付加してください。サンプルコードではrandom_bytes()を用いて安全なランダムなソルトを生成しています。生成されたハッシュとソルトは一緒に保存し、認証時には保存したソルトを用いて入力データからハッシュを再計算し、保存されたハッシュと比較して検証します。なお、パスワードのハッシュ化には、より強力なアルゴリズムを提供するpassword_hash()関数の利用が一般的に推奨されます。