5

データベースにアクセスできる従業員がアカウントにアクセスできるようにすることなく、システムでユーザーアカウント管理を処理する最良の方法は何ですか?

例:

  1. ユーザー名/パスワードをデータベースに保存します。データベースにアクセスできる人なら誰でもユーザー名とパスワードを見ることができるため、これは悪い考えです。したがって、それを使用します。

  2. ユーザー名/パスワードのハッシュを保存します。これはより良い方法ですが、データベース内のパスワード ハッシュを、認証情報を知っている別のアカウントのハッシュに置き換えることで、アカウントにアクセスできます。次に、アクセスが許可された後、データベースに戻します。

Windows/* nix はこれをどのように処理しますか?

4

11 に答える 11

5

これはより良い方法ですが、データベース内のパスワード ハッシュを、認証情報を知っている別のアカウントのハッシュに置き換えることで、アカウントにアクセスできます。

これを回避する方法は本当にありません。パスワード ファイルへの書き込みアクセス権を持つユーザーは、コンピュータを完全に制御できます。

于 2008-09-13T18:51:29.327 に答える
4

これは何年も前に UNIX でよく見られた問題であり、ユーザー ID コンポーネント (ユーザー名、UID、シェル、フル ネームなど) を認証コンポーネント (パスワード ハッシュ、パスワード ハッシュ ソルト) から分離することで解決されました。ID コンポーネントはグローバルに読み取り可能ですが (UID をユーザー名にマップする場合は実際にそうする必要があります)、認証コンポーネントはユーザーがアクセスできないようにしておく必要があります。ユーザーを認証するには、ユーザー名とパスワードを受け入れ、「認証された」または「認証されていない」という単純な結果を返す信頼できるシステムを用意します。このシステムは、認証データベースにアクセスできる唯一のアプリケーションである必要があり、タイミング攻撃を回避するために応答する前にランダムな時間 (おそらく 0.1 ~ 3 秒) 待機する必要があります。

于 2008-09-16T17:06:52.610 に答える
4

私は2で行きますが、塩を使用します。擬似コード:

SetPassword(user, password)
    salt = RandomString()
    hash = Hashfunction(salt+password)
    StoreInDatabase(user, salt, hash)

CheckPassword(user, password)
    (salt, hash) = GetFromDatabase(user)
    if Hashfunction(salt+password) == hash
        return "Success"
    else
        return "Login Failed"

ライブラリに実装されているよく知られたハッシュ関数 (MD5 や SHA-1 など) を使用することが重要です。自分で作成したり、本から実装しようとしたりしないでください。間違ってしまうリスクを冒す価値はありません。

@Brian R. Bondy: ソルトを使用する理由は、辞書攻撃をより困難にするためです。攻撃者は辞書をハッシュしてすべてのパスワードを試すことはできません。代わりに、彼女はソルト + 辞書を取得してハッシュする必要があります。ストレージ要件が明らかになります。最も一般的な 1000 個のパスワードの辞書があり、それらをハッシュすると、16 kB 程度が必要になりますが、ランダムな文字を 2 つ追加すると、62*62*16 kB ≈ 62 Mb になります。

私はOTPWについて良いことを聞いたことがありますが、使用したことはありません。

于 2008-09-13T20:51:06.093 に答える
3

Jeff Atwood は、ハッシュに関するいくつかの優れた投稿を持っています。

于 2008-09-14T08:37:14.180 に答える
3

openID を使用して、機密のユーザー パスワードをまったく保存しないこともできます。ウェブサイト専用だと誰が言ったのですか?

于 2008-09-13T19:29:54.993 に答える
2
  1. 本当に悪い考えです。データベースが侵害された場合、すべてのアカウントが侵害されます。
  2. 良い方法です。ハッシュ アルゴリズムにユーザー名が含まれている場合、パスワード ハッシュを別のものに置き換えても機能しません。

Unix は、特権ユーザーのみがアクセスできるテキスト ファイル /etc/shadow にハッシュを保存します。パスワードはソルトで暗号化されます。

于 2008-09-13T18:41:54.857 に答える
0

ユーザー名とパスワードを一緒にハッシュします。そうすれば、2 人のユーザーが同じパスワードを持っていても、ハッシュは異なります。

于 2008-09-13T22:27:28.777 に答える
0

「システム」が公開 Web サイトの場合、RPXは、OpenId、Facebook、Google などの最も一般的なプロバイダーのログイン/ユーザー アカウント サービスを提供できます。

さて、あなたが質問を定式化する方法を考えると、あなたが話している「システム」は、内部のWindows / Linuxベースのエンタープライズアプリである可能性が高いと思います. それにもかかわらず; ログイン/ユーザー アカウント プロバイダーを探し回っているユーザー (RPX に出会う前に行ったように) には、これが適している可能性があります :)

于 2010-05-08T19:58:32.887 に答える
0

通常のアプローチは、電子メールでオプション 2 を使用することです。

ユーザー名、パスワード ハッシュ、電子メール アドレスをデータベースに保存します。

ユーザーはパスワードを入力するかリセットすることができます。後者の場合、ランダムなパスワードが生成され、ユーザーの新しいハッシュが作成され、パスワードが電子メールでユーザーに送信されます。

編集:データベースが侵害された場合、機密情報にアクセスできないことを保証することしかできず、アプリケーションのセキュリティを確保できなくなります.

于 2008-09-13T22:02:06.093 に答える
0

ハッシュ化されたパスワードのソルトを別のテーブルに保存できます。もちろん、各ユーザーには独自のソルトがあります。その後、そのテーブルへのアクセスを制限できます。

于 2008-09-13T18:38:05.710 に答える