web-dev-qa-db-ja.com

パスワードを生成するためのPBKDF2のこの使用は安全ですか?

読む セキュリティエンジニアリング ロスアンダーソン、 2.4.7.1章パスワードマングラー 私が既存の問題を最終的に解決するように見えるアイデアを得ました '私は強いことを覚えておく必要があります*あまりにも多くのシステムのソリューションのパスワード。

*)パスワードはランダムに生成され、使用するサービスの重要度に応じたサイズで、最小8文字、通常最大約16文字です。


既存のソリューションについて私が気に入らない点の簡単な内訳:

  • それらを書き留めてください:安全ではなく、リストは常にアクセス可能であるとは限りません。
  • それらを暗号化されたファイルに保存します:常にアクセスできるとは限りません。
  • 専用のソフトウェアを使用してください:常にアクセスできるとは限りません。


つまり、私は次のような解決策を探していました。

  • インターネットに接続しているときはいつでも利用できます。
  • 安全です(誰も私のパスワードを盗んだり解決したりすることはできません)。


それで、私の質問は:
マスターパスワード(ランダムに生成された12個の印刷可能なASCII文字)に基づいて、Webサイトのドメイン名(stackexchange.com)を「ソルト」として使用して、PBKDF2を使用してパスワードを生成するのは安全ですか?

<?php
$password = $_POST['password'];
$salt = $_POST['publicIdentifier'];

function passKey($password, $salt) {
    $iterationCount = pow(2, 18); // 262.144 iterations
    $outputLength = 20; // because this should be 'secure enough'?

    // Step 1: get the derived key
    $generated = hash_pbkdf2('sha256', $password, $salt, $iterationCount, $outputLength, true); // returns binary output

    // Step 2: encode as Base91
    $generated = base91_encode($generated); // because we want 'special characters' in our password string (websites often require this)

    // Step 3: return the password, sliced down to required length
    return substr($generated, 0, $outputLength);
}
echo 'generated password: '.passKey($password, $salt);

ソリューションが自分の信頼できるWebサーバーでホストされ、SSL/TLSを介してのみアクセスできるとしたら?


攻撃者が使用されたコード(上記に投稿)、「publicIdentifier」、および場合によっては生成されたパスワードのリストにアクセスできる場合、上記のスキームは攻撃者がマスターを理解するのを防ぎますパスワード?

shortランダムに生成されない文字列をソルトとして使用すると、PBKDF2の強度が低下する可能性があるのではないかと心配しています。

2
Monika

専門のWebサイトにアクセスしてパスワードを取得できるのなら、なぜ専門のWebソフトウェアにアクセスしてパスワードを取得できないのでしょうか。たとえば、LastPassはオンライン検索を提供します。

データベースを備えたサムドライブで、ポータブルバージョンのKeePass(およびその他のローカルパスワードマネージャー)を携帯することもできます。

または、最近のほとんどのパスワードマネージャーはスマートフォンアプリを持っているので、スマートフォンを持っていてほとんどの場所に持っていれば、そこから簡単にパスワードを取得して入力できます。

言い換えれば、正しく行われ、少し計画を立てれば、必要なときにパスワードマネージャーにアクセスできない状況はおそらくほとんどありません。

0
Ben