はじめに
PHP8上級試験の問題集には、「hash() 関数はソルトを自動で付与するため毎回異なる出力になる」 というトラップ的な記述があります。しかし実際には、hash()
関数はソルトを付与しません。同じ入力に対しては、常に同じ結果を返します。
この記事では、試験対策として hash()
と password_hash()
の違いを整理します。
目次
hash() 関数の仕様
hash(
string $algo,
string $data,
bool $binary = false,
array $options = []
): string
$algo
: アルゴリズム(例:"sha256"
,"md5"
)$data
: 入力データ$binary
: 出力形式(デフォルトは16進数文字列)$options
: 一部のアルゴリズムで利用可能
👉 重要:ソルトは自動で付与されない。
実行例
<?php
declare(strict_types=1);
error_reporting(-1);
for($i = 0; $i < 3; ++$i){
var_dump(hash('sha256', 'aaa'));
}
出力結果(例)
string(64) "9834876d...(固定のハッシュ値)"
string(64) "9834876d...(同じ値)"
string(64) "9834876d...(同じ値)"
同じ入力に対しては、毎回同じハッシュ値が得られます。
password_hash() との違い
password_hash()
は毎回ランダムなソルトを自動で付与するため、同じ入力でも出力が異なります。
<?php
echo password_hash('aaa', PASSWORD_DEFAULT) . PHP_EOL;
echo password_hash('aaa', PASSWORD_DEFAULT) . PHP_EOL;
出力結果(例)
$2y$10$yRb5...(毎回異なる)
$2y$10$dKf1...(毎回異なる)
まとめ
hash()
… ソルトなし。同じ入力なら常に同じ結果。password_hash()
… 自動ソルトあり。同じ入力でも毎回違う結果。- 試験では 「hash() は毎回違う出力を返す」という記述は誤り に注意!
👉 この記事を読んだ受験者は、「ソルトが絡むのは password_hash() のほう」と瞬時に区別できるようになります。