別の質問 からタイトルをコピーしましたが、そこには回答がなく、私の場合は少し異なります。
私は維持するために古いウェブサイトを継承しました。パスワードハッシュが最新のベストプラクティスに達していないことに気づきましたが、それが合理的に安全であるか、変更が必要かどうかを理解したいと思います。
ハッシュを行うコードは次のとおりです。
public function changePW($password)
{
//
$new_salt = $this->random();
$new_password = $this->hash($password, $new_salt);
//
}
public function random($limit = 10, $from = 32, $to = 126) {
$phrase = '';
for ($i=0; $i<$limit; $i++) {
$phrase .= chr(Rand($from,$to));
}
return $phrase;
}
// self::$_salt is a constant 12 character string
// of 3 words with some letters replaced by numbers
public static function hash($password, $salt) {
return hash('whirlpool', self::$_salt . $password . $salt);
}
この手順は、8文字以上のパスワードに対して欠陥/脆弱性があると考えるべきですか?
ワールプール自体は、SHA-512のような暗号的に安全なハッシュ関数であり、シークレットのハッシュに関連する既知の弱点はありません。ただし、パスワードハッシュに直接使用するのは高速であるため、攻撃者が1秒あたり多くのパスワードを推測できるため、これは悪い考えです。これはWhirlpoolハッシュに固有のものではありません。 Argon2のようなメモリハードKDF、または少なくともPBKDF2のような遅いKDFを使用する必要があります。
これが重要である理由については、 パスワードを安全にハッシュする方法 を参照してください。
_password-hash
_( https://www.php.net/manual/en/function.password-hash.php )を使用します。これは、PHPは引き続き新しいバージョンをリリースします。ユーザーにパスワードの更新を要求することは大きな問題ではありません。Whirlpoolには既知の暗号化上の欠陥はありませんが、使用するより優れたアルゴリズムは確かにあります。ソース: https: //www.novatec-gmbh.de/en/blog/choosing-right-hashing-algorithm-slowness/
さらに、salt関数は暗号的に安全ではないため、Rand()
を使用しないでください。攻撃者がデータベースにアクセスする前にソルトが何であるかを知っている場合、アクセスが取得されるとクラック時間を短縮できます。すべてのソルトは、合理的である限り、グローバルに一意である必要があります。
説明するアルゴリズムは、通常の高速ハッシュです。このようなハッシュアルゴリズムは、ファイルの整合性をチェックするためだけに使用し、パスワードのハッシュには使用しないでください。ワールプールおよび類似のアルゴリズムは高速になるように設計されているため、ブルートフォース攻撃が容易になります。
キーストレッチ/パスワード導出を使用。たとえば、PBKDF2、scrypt、またはArgon2を使用します。は、ブルートフォース攻撃を非効率にして、パスワード保護を強化するように設計されています。