3

私が設計した認証システムに関するフィードバックを期待しています。

要件は、クローズドなシングル サインオン Web 環境を作成することです。従業員の 1 人が Web アプリケーションの 1 つにアクセスすると、LDAP によってバックアップされた資格情報でサインインするよう求められます。サインインすると、設定された期間またはブラウザー セッションの間、およびすべての Web アプリケーションでこのログインを保持します。Google のウェブ プロパティが Google アカウントで機能するのとほとんど同じですが、Google の内部システムが対象です。

ユーザー自身は Windows、Mac、Linux から操作し、一部はタブレットのみで操作するため、この認証環境はオンラインのみで存在する必要があり、mod_auth_kerb を使用した kerberos などでは対応できません。

現在のすべての Web アプリケーションは PHP を使用しています。

私がこれまでに持っているシステムは、以下のように機能します。

認証ハンドラーまたは略して「ハンドラー」と呼ぶ 1 つの中央認証システムと、認証リクエスターまたは略して「リクエスター」と呼ぶ 1 つ以上の認証「クライアント」Web アプリが存在します。ユーザーとそのブラウザーを単に「ユーザー」と呼びます。

requestor_idまた、それが機能するためには、その ID の固有の戻り URL を使用して、ハンドラーでリクエスターを事前構成する必要があります。ハンドラーの秘密鍵が生成され、事前にすべてのリクエスターにも公開鍵が与えられます。

ユーザーがリクエスタにアクセス

  1. ユーザーがリクエスタの URL を入力します。
  2. リクエスターにはこのユーザーのセッションが存在しないため、リクエスターはSESSION_IDPHP で (組み込みのセッション ハンドラーと を使用してsession_start) 新しいセッションを作成します。
  3. セッションには認証がないため、リクエスターは、authrequestトークンとenvelope.
    1. session_regenerate_idリクエスターはまず、クライアントのこの認証リクエストに対して新しい session_id (PHP で) を再生成します。
    2. リクエスターは、この場合は PHP を使用してランダムなパスワードを生成し、openssl_random_pseudo_bytesこれをセッション データに保存します。
    3. 次に、リクエスタは PHP の usingのランダム パスワードでSESSION_IDusingを暗号化します。AES256authrequestopenssl_encrypt
    4. 次にリクエスタは、一意requestor_idの ':' と base64 でエンコードされたランダム パスワードを連結して、エンベロープ データを生成します。
    5. openssl_public_encrypt次に、リクエスターのエンベロープ データは、PHP で使用するハンドラーの事前共有公開鍵を使用して暗号化されます。
  4. 次に、リクエスターlocation:は、暗号化された URL パラメーターを含むヘッダーをユーザーにenvelope送信し、 authrequestURL パラメーターをハンドラーに送信します。
  5. ハンドラは、秘密鍵を使用してエンベロープを復号化し、clientID とパスワードを分離します。
  6. ハンドラーは、requestor_idこれが構成されているかどうかを確認し、構成されていない場合は、リクエスターが認識されなかったことをユーザーに通知します。
  7. ハンドラーはユーザーを認証します (この場合、ユーザー名とパスワードを要求し、LDAP に対してチェックすることによって、および/または事前認証されたセッションを介して)
  8. ハンドラーはauthtokenリクエスターへのリターンを 生成します
    1. ハンドラーは、エンベロープから復号化およびデコードされたパスワードを使用して、 SESSION_IDfromを復号化します。authrequest
    2. SESSION_IDハンドラーは、エンベロープから復号化およびデコードされたパスワードを使用して、ログイン資格情報の ID (ユーザー名、GUID など) を含む新しい文字列を暗号化します。
  9. 次に、ハンドラーは、 as URL パラメーターをlocation:含むヘッダーをユーザーに送信し、 this の事前構成された URL に送信します。authtokenrequestor_id
  10. requestor はリクエストを受け取り、ユーザー セッションでパスワードを使用してトークンを復号化します。
  11. リクエスタはSESSION_ID、ユーザーの現在のセッションと一致することを確認します。そうでない場合は、認証を再開します。
  12. リクエスターは、返された crednetialID を使用して、ローカル ユーザーが認証済みであることを識別できます。

このプロセスを異なるシステム間で繰り返すことで、シングル サインオンの動作を実現できます。

だから、質問:

  1. 上記と同様の要件とプリフォームを満たす、既存の標準化された認証システムを知っている人はいますか?
  2. そうでない場合、そして私がセキュリティの専門家ではないことを考えると、それ以上に壊れる可能性のあるものはありますか? つまり、この方法の弱点は何ですか?
4

2 に答える 2

0

Kerberos を使用することもできます: http://web.mit.edu/kerberos/www/
または、内部 OpenID システムを実装します: http://openid.net/
OpenID 用の PHP ライブラリもいくつかあります: http://openid.ネット/開発者/ライブラリ/

于 2012-10-10T07:18:58.397 に答える
0

暗号化前のパスワードのbase64エンコーディングは、他の場所で通信されるデータをシリアル化するために主に使用される機能であるため、(少なくとも私にとっては)実際には意味がありません。ただし、エンベロープが暗号化されると、バイナリ データが再び得られるため、暗号文をシリアル化する必要があります。

また、クライアント側で資格情報のハッシュを実行できるかどうかを確認することもできます (1000 回反復され、ソルト化された MD5 または SHA-* で問題ありません)。RFC2617 (HTTP Digest Access Authentication) を参考にしてください。これは、サーバーで復号化する際のパスワードの脆弱性に対抗するためです。

于 2012-10-10T07:55:05.213 に答える