【Laravel6】テストコードでハッシュ値の値を比べる場合のやり方(Hash::make()を使う時の注意点)

Laravel

スポンサーリンク

Laravelのテストコードを書いている中で、パスワードのハッシュ値とDBの値が一致するかのテストをしようとしてたときに一致するはずなのに一致しなくてはまったので、解決方法を記載しておく。

結果として正解は以下の書き方。assertTrueを使ってHash::checkで比較する!

$this->assertTrue(Hash::check('newpassword', $user->password));

はまったやり方

最初は以下のように書いていてうまくいかなかった。

$this->assertEquals(Hash::make('newpassword'), $user->password);

ちなみに$user->passwordはちゃんとHash::make('newpassword’)した値が入っているので中身は同じなはずなのだ。

しかし、これを実行すると、以下のように違う値だと言われる。

Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'$2y$04$7UACpR5WUKKtPYTkVaCr3Ow7A2Eo8zEewgsd9gT1wTEMyRpOA4dhO'
+'$2y$04$7Tw9QIbMmsSHuMJkAuGEcefUjV8HwTMH5ZC0R4WInJGpxq5I5byX6'

試しに、以下のコードを実行した。これはどう考えても等しいはず。

$this->assertEquals(Hash::make('password'), Hash::make('password'));

しかし結果は、、、

Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'$2y$04$TUTX9oiFN7OtKAiGuWpE.uFo8B9qYr1ppG5hVkj8C/qc/5fdo9pru'
+'$2y$04$0hQqjjVPsCOBfmVFNEmhYeye1lLCr4wZo.erf4c9kPzSCgGI.HGZq'

やはりだめ。

Hash::make()の注意点

実はLaravelのHash::make()は特殊で、同じ値をHash::make()しても、毎回違う値が生成されるのです。
Hash::make()はパスワード保存用にセキュリティを強化されたメソッドらしく、普通のハッシュ値とは違うのです。

※一般的なハッシュ値は、同じ値は同じハッシュ値になります。

正しい比較の仕方

ということで、Hash::make()で作られた値は以下のようにHash::checkで比較するのが正しい。

$this->assertTrue(Hash::check('newpassword', $user->password));

assertTrueを使ってHash::checkで比べる。

はまった方はこれで解決!!

Laravel

Posted by ton