web-dev-qa-db-ja.com

ユーザーのパスワードを保存せずに認証済み暗号化を使用するログインシステム

私はセキュリティの専門家ではないので、ばかげた質問をするかもしれませんが、私が考えていることを説明させてください。

まず、多くのWebサイトにはハッシュ/暗号化されたパスワードが保存されており、dbのテーブルがハッキングされるとブルートフォース攻撃によって解読される可能性があることを知っています。ハッカーは、他のWebサイトでパスワードを使用したり、他の機密情報にアクセスしたりできる場合もあります。

AESを壊すことはできない認証された暗号化 に類似したロジックを使用できないのはなぜですか? ここ は別の関連リンクです。例えば、

  1. 予想されるファイルとして1kbのランダムバイナリファイルを準備します。
  2. ハッシュされたパスワードを使用して予期されるファイルを暗号化する
  3. ユーザーがシステムにログインしたら、暗号化されたファイルを復号化してパスワードを検証し、予期されたファイルと照合します。失敗した場合、ログインを拒否します。秘密の質問と回答に同じロジックを使用して、実際に回答を保存せずにパスワードをリセットできると思います。

機密ファイルもパスワードを使用して暗号化されている場合、ユーザーはパスワードをリセットできません。それを行う方法はありますか?

これを書いているとき、私は非常によく似た question を見つけましたが、クライアント側の復号化について話しており、サーバー側(またはローカルシステム内のみ)について話しています。

コメントや提案をいただければ幸いです。

2
niea

実際、あなたの提案はハッシュされたパスワードのバリエーションです。この場合にのみ、検証されるのはハッシュではなく、暗号化/復号化されたblobです。したがって、(合理的に実装された)ハッシュされたパスワードとほぼ同じ利点と欠点があります。 [〜#〜] pbkdf [〜#〜] を参照してください。適切に設計されている場合-たとえば bcrypt (c.f. パスワードの保存にbcryptを推奨するセキュリティ専門家はいますか? )-ほとんどのシナリオでかなり良いセキュリティを提供します。

あなたが参照している質問( ランダムなblobを復号化することによるユーザー認証 )は実際にはかなりうまくカバーしていると私は思います。

パスワードで暗号化されたユーザーのデータについては-パスワードを変更すると、もちろん古いもので暗号化されたものすべてを再暗号化する必要があります(つまり、古いもので復号化し、新しいもので暗号化する)。これは通常、階層化された方法で回避されます。データ自体はランダムに生成されたキーで暗号化され、次に、パスワードで生成されたキーで暗号化されます。パスワードを変更する場合、必要なのは、実際の暗号化キーを再暗号化することだけです。また、複数のパスワードを使用して同じデータにアクセスすることもできます(データを暗号化するまさにこの方法の1つの例は [〜#〜] luks [〜#〜] です)。

とはいえ、独自の暗号化ソリューションを作成するつもりですか? 私の開発者の自家製のパスワードセキュリティは正しいですか、それとも間違っているのですか? 最初に読んでください。

5
peterph