【PHP8.x】sha1_file関数の使い方
sha1_file関数は、指定されたファイルのSHA1ハッシュ値を計算して返却する関数です。
SHA1(Secure Hash Algorithm 1)とは、任意の長さのデータから固定長の短い文字列(ハッシュ値)を生成する暗号学的ハッシュ関数の一種です。このハッシュ値は、元のファイルの内容が少しでも変更されると全く異なる値になるという特性を持っています。そのため、ファイルの改ざん検出や、ダウンロードしたファイルの整合性確認、ファイルが重複していないかのチェックなど、さまざまな場面で利用されます。
この関数は、引数としてハッシュ値を計算したいファイルのパス(ファイル名を含む文字列)を受け取ります。処理が成功した場合は、40文字の16進数文字列としてSHA1ハッシュ値を返します。ファイルが存在しない場合や、読み込み権限がない場合、あるいはその他の理由でハッシュ値の計算に失敗した場合は、false
を返します。
例えば、インターネットからファイルをダウンロードした後、そのファイルが途中で破損していないか、あるいは第三者によって改ざんされていないかを確認したい場合に sha1_file
関数が役立ちます。提供元が公開しているSHA1ハッシュ値と、ダウンロードしたファイルに対して sha1_file
関数で計算したハッシュ値を比較することで、ファイルの同一性を検証することができます。
ファイルの整合性チェックなどの用途では有効ですが、現代のセキュリティ要件では、より強力なハッシュ関数(例: SHA-256など)の利用が推奨される場合もありますので、用途に応じて適切なハッシュ関数を選択することが重要です。
基本的な使い方
構文(syntax)
<?php
// 一時ファイルを作成し、内容を書き込む
$filename = 'example.txt';
file_put_contents($filename, 'Hello, PHP!');
// sha1_file 関数を使用してファイルのSHA1ハッシュを計算
$sha1_hash = sha1_file($filename);
// ハッシュ値を出力
echo $sha1_hash;
// 使用した一時ファイルを削除
unlink($filename);
?>
引数(parameters)
string $filename, bool $binary = false
- string $filename: ハッシュ化するファイルへのパスを指定する文字列
- bool $binary = false: trueを指定すると、バイナリ形式のハッシュ値が返されます。デフォルトはfalseで、16進数形式のハッシュ値が返されます。
戻り値(return)
string|false
指定されたファイルのSHA-1ハッシュ値を文字列で返します。ファイルの読み込みに失敗した場合はfalseを返します。
サンプルコード
PHPでファイルのsha1ハッシュを計算する
<?php
/**
* sha1_file関数を使用してファイルのSHA1ハッシュを計算するサンプルコードです。
* このスクリプトは一時ファイルを作成し、そのハッシュを計算後、ファイルを削除します。
*/
// 1. 一時ファイルのパスを生成します。
// sys_get_temp_dir() はシステムの一時ディレクトリのパスを返します。
// tempnam() は指定されたディレクトリに一意なファイル名を持つ一時ファイルを作成し、そのパスを返します。
$tempFilePath = tempnam(sys_get_temp_dir(), 'php_sha1_example_');
// tempnam() が失敗した場合(ファイルを作成できなかった場合)の処理です。
if ($tempFilePath === false) {
echo "エラー: 一時ファイルの作成に失敗しました。\n";
exit(1); // スクリプトを終了します。
}
// 2. 一時ファイルに内容を書き込みます。
$fileContent = "この文字列のSHA1ハッシュを計算します。\nPHPは強力な言語です。\n";
// file_put_contents() は指定されたファイルにデータを書き込みます。
// 成功した場合は書き込まれたバイト数を、失敗した場合は false を返します。
if (file_put_contents($tempFilePath, $fileContent) === false) {
echo "エラー: 一時ファイルへの内容の書き込みに失敗しました。\n";
// 書き込みに失敗した場合でも、作成された一時ファイルがあれば削除を試みます。
unlink($tempFilePath);
exit(1);
}
echo "一時ファイル '" . basename($tempFilePath) . "' を作成し、内容を書き込みました。\n";
echo "ファイルパス: " . $tempFilePath . "\n";
echo "ファイル内容:\n---\n" . $fileContent . "---\n\n";
// 3. sha1_file関数を使用して、一時ファイルのSHA1ハッシュを計算します。
// 第1引数: ハッシュを計算したいファイルのパス。
// 第2引数: オプション。true を指定するとバイナリ形式のハッシュが返されます。
// デフォルトは false で、40文字の16進数文字列が返されます。
$sha1Hash = sha1_file($tempFilePath, false);
// 4. ハッシュ計算の結果を確認し、表示します。
if ($sha1Hash !== false) {
echo "計算されたSHA1ハッシュ: " . $sha1Hash . "\n";
} else {
// sha1_fileが false を返した場合(例: ファイルが存在しない、読み取り権限がないなど)の処理です。
echo "エラー: SHA1ハッシュの計算に失敗しました。ファイルへのアクセスを確認してください。\n";
}
// 5. 使用した一時ファイルを削除します。
// unlink() は指定されたファイルを削除します。
if (unlink($tempFilePath)) {
echo "\n一時ファイル '" . basename($tempFilePath) . "' を正常に削除しました。\n";
} else {
echo "\n警告: 一時ファイル '" . basename($tempFilePath) . "' の削除に失敗しました。\n";
}
?>
このPHPサンプルコードは、sha1_file
関数を使用してファイルのSHA1ハッシュを計算する手順を具体的に示しています。SHA1ハッシュは、ファイルの内容が改ざんされていないかを確認する際などに利用される、一意の固定長文字列です。
スクリプトはまず、tempnam()
関数でシステムの一時ディレクトリに新しい一時ファイルを作成し、file_put_contents()
関数でそのファイルに文字列データを書き込みます。次に、sha1_file
関数を呼び出して、作成した一時ファイルのSHA1ハッシュを計算します。この関数の第一引数$filename
には、ハッシュを計算したいファイルのパスを指定します。第二引数$binary
はオプションで、true
を指定するとバイナリ形式のハッシュが、デフォルトのfalse
では40文字の16進数文字列が戻り値として返されます。処理が成功すると計算されたハッシュ文字列が、ファイルが見つからない、読み取り権限がないなどの理由で失敗した場合はfalse
が戻り値となりますので、結果の確認が重要です。最後に、unlink()
関数で作成した一時ファイルを削除し、リソースを適切に解放しています。この一連の操作により、ファイルに対するハッシュ計算と、それに伴うエラーハンドリングの基本を学ぶことができます。
sha1_file
関数は、指定したファイルが存在し、PHPが読み取り可能な場合にのみ機能します。ファイルにアクセスできない場合はfalse
を返すため、戻り値の判定は===
演算子で厳密に行ってください。また、SHA-1はセキュリティ上の脆弱性が指摘されているため、パスワードの保存など、安全性が求められる用途には絶対に使用してはいけません。ファイルの同一性検証など、用途を限定して利用し、パスワードにはより安全なpassword_hash()
関数を使用してください。サンプルコードのように一時ファイルを利用した場合は、処理後にunlink()
で必ず削除することが重要です。