web-dev-qa-db-ja.com

データベーステーブル内のプレーンテキストのパスワード/ユーザー名を保護するためのカスタマイズされたアプローチ?

現在、ユーザーが登録し、多くのメールアカウント(Gmailなど)をサイトに接続し、メールの送信などのメール関連のアクティビティを許可するアプリを作成中です(質問したり、言ったりしないでください)。 「ユーザーはメールクライアントまたはGmailタブに移動するだけで、それを実行できます!」、私は知っています。)オンラインメールクライアントを作成していると言えます。 Thunderbird、Outlook、またはAppleのメールクライアントがログイン資格情報を管理する方法を調べようとしましたが、それを完全に理解することはできませんでした。

アプローチ:

彼らが初めて私のアプリにメールのログインとパスワードを送信するとき、私たちは以下を行います:

  1. ユーザー名とパスワードを30〜40文字のキーでソルトします(ユーザーごとに異なります)
  2. aES-256暗号化を使用します(ユーザー名とパスワードには別の場所に保存されている異なるキーがあります)
  3. 次に、暗号化されたユーザー名と暗号化されたパスワードを保存します

私は理論、一方向ハッシュを使用する業界で認められたアプローチ、および多くのオープンソースライブラリを知っていますが、私のアプリは、たとえば、ユーザーがメールを送信するたびに、ユーザーのメール資格情報を送信する必要があります。

データベースに保存されているユーザーの電子メール設定レコードの出力例を次に示します(Railsを使用)。

#<EmailSetting id: 10, user_id: 3, 
username: "{\"v\":1,\"adata\":\"\",\"ks\":256,\"ct\":\"E1M3+Eza9w5yNIoBVS...", 
password: "{\"v\":1,\"adata\":\"\",\"ks\":256,\"ct\":\"8N/Ylh7IGiHKDz1QM7...", 
outgoing_server: "smtp.gmail.com", 
incoming_server: nil, 
email_connection_type: nil, 
outgoing_port: 587, 
outgoing_authentication_type: "plain">

このデータベースが危険にさらされた場合でも、サービスを提供している間、できる限りユーザーを保護できるようにしたいと思います。

質問:これは電子メールのログイン資格情報を保護するのに十分強力ですか?データベーステーブルを保護する際に忘れている可能性のあるものはありますか?

4
Matthew

サービスプロバイダーとして、パスワードを取得できる方法で保存しないでください。自分自身を電子メールクライアントと比較することは、それを考えるのに悪い方法であり、攻撃者の視点を考慮していません。 Thunderbirdのインストールを危険にさらすと、攻撃者は1つまたは数セットの資格情報しか取得できません。サービスを危険にさらすと、攻撃者が顧客ベースの資格情報全体を取得する可能性があります。

他のコメンテーターが指摘しているように、あなたは今、パスワードセットを保護する仕事をしています。それが危険にさらされ、DBアクセスが可能である場合、すべての顧客のGmailユーザー名とパスワードが漏洩していることになります。たくさんのお客様がいらっしゃるなら、これは金鉱です。熱心な攻撃者の力を過小評価しないでください。

Stephen Tousetが指摘しているように、 GMail API を使用する必要があります。これはパスワードを公開しませんが、 OAuth2 フレームワークを使用して取り消し可能なトークンを使用します。侵害された場合、トークンはすべて取り消される可能性があります。攻撃者がすべてのユーザー名とパスワードの組み合わせを取得できた場合、それは不可能です。

1
Steve Sether