ハッシュ関数は、別名、一方向性暗号などとも呼ばれるように、アルゴリズム的な手順では平文に戻すことはできません。その意味で復号はできません。
しかしながら、平文パスワードが絶対に分からないというわけではありません。例示されたパスワードは8文字で、英数字のみで構成されています。このような仕様を満たす文字列は有限の組み合わせしかありません。したがって、全ての可能性を総当りで調べれば、時間はかかりますが、平文パスワードが判明します。
では、どの程度時間が掛かるかですが、最近のGPU(画像処理プロセッサ)の高速性を活かして、ハッシュのアルゴリズムにもよりますが、8文字英数字でも一日程度で総当り計算できる場合もあります。したがって、単にハッシュで保存すれば、パスワード平文を保護できるというものでもないのです。
そのため、よりよいパスワード保存の方法としては下記が求められます。
- ソルトを利用者毎に異なるものにすることで、パスワードが同じでもハッシュ値は異なるようにする
- 低速なハッシュ関数を用いるか、ハッシュ計算を何度も繰り返す(ストレッチング)により、ハッシュ値の計算に時間が掛かるようにする
この点で、提示されているパスワードのハッシュ計算方法は改良の余地があります。hash_hmac関数はHMACを求める関数ですが、HMACの主用途はデータの改ざんを防止するためであり、例えば数GバイトもあるDVD-ROMのイメージが改ざんされていないことを保証するような用途にも使うため、高速性が要求されます。また、ソルトに相当する秘密鍵が固定なので、同じパスワードに対してハッシュ値が同じになってしまいます。
PHPには、パスワードの保護のための password_hash / password_verify という便利で安全な関数が用意されているため、こちらを使用することをお勧めします。
長くなりましたが、ご質問に対する答えは以下です。
- ハッシュで保存されたパスワードの平文を求めることは可能だが、通常は、時間が非常に掛かる
- 平文パスワードを求めるのに時間が掛かる方式ほど安全性が高くなる
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。