1

アプリから Node.js TCP ソケット サーバーに接続する複数のクライアントがあります。セッションを安全に管理する方法を知りたいです。

ユーザー名とパスワードがソケットを介してサーバーに渡されます。サーバーはこれが正しいことを確認します。

クライアントに送り返す一意のトークンを生成する必要があると思います。

ユーザーがアプリを閉じてから再度開くと、このトークンをサーバーに渡すことができるため、サーバーはユーザーが再度認証されたことを確認します。

ただし、このトークンは、他の誰かがこの人のアカウントにアクセスするために使用できる可能性があります。これを防ぐ方法はありますか?

より安全な方法はありますか (ユーザーが再度ログインせずに認証する機能を維持しながら)?

同じログインを使用して他のデバイスからの接続をどのように処理しますか? 彼らは異なるトークンを取得しますか、それとも同じトークンを取得しますか?

どうもありがとう。

4

3 に答える 3

4

それは、十分に安全であるというあなたの定義に帰着します。あなたが今行っていることは、本質的にセッション追跡であり、一般的に多くの汎用用途に対して十分に安全ですが、通常、セッションが特定の IP に対してのみ有効であると見なされる追加のコンポーネントが追加されています。ユーザーの IP が変更された場合は、再度ログインさせ、新しいトークンを発行する必要があります。そうすれば、悪者が自分のセッション ID をハイジャックしても、何の役にも立ちません。

もちろん、これは悪者がクライアントと同じ IP アドレスから来ているように見えない場合にのみ有効です。クライアントと同じ NAT の背後にいて、同じ IP から来ているように見える悪者が心配な場合は、セキュリティをもう少し強化し、SSH に似たシステムを検討する必要があります。を使用しますが、それはもう少し複雑です。

複数のデバイスからの接続に関しては、それはあなた次第です-いくつかの単一のトークンを追跡し、ユーザーが別のIPからログインしたときにそのトークンを返すことができます(同時に両方のIPがサイトにアクセスできるようになりました)同じトークンを使用する)、または誰かが認証するたびに新しいトークンを発行することができます。個人的には、新しいトークンを発行する方が簡単で、追跡や手間がはるかに少ないと思う傾向があります...しかし、アプリケーションと物事をどのように整理したいかによって、両方の方法の良いユースケースを思いつくことができます.


また、パスワード交換を行うことに関しては..少なくともそこでいくつかのハッシュを行う必要があります。つまり、サーバーはクライアントに some を送信しrandom_string、クライアントは何らかのhash関数 (md5または などsha) を使用して計算hash(random_string + hash(username + password))し、それを返します。次に、サーバーはhash(random_string + password_hash)、ユーザーが送信したものと等しいことを確認することにより、これが一致することを確認します。これにより、ユーザーのプレーンテキストパスワードをどこにも保存する必要がなくなりpassword_hash = hash(username+password)、パスワードが変更されたときにサーバーに保存するだけになります。

于 2013-01-09T21:58:15.680 に答える
1

多分このようなもの:

FIRST LOGIN:
username + pwd (hashed)       ---> check user/hashed pwd
receive token                 <--- send token 

NEXT LOGIN:
request login                 ---> receive request 
receive random string         <--- send random string
hash string with token as salt ---> compare hashed string

そのランダムな文字列での試行を 1 回だけ許可し、可能であれば元のログインから IP を確認する必要があります。

ログイン時にトークンを傍受できるため、これは完全ではありませんが、ユーザー名とパスワードも取得できます。

于 2013-01-06T19:26:52.673 に答える
0

この質問は基本的に、盗まれた Cookie を使用したセッション ハイジャックに帰着します。したがって、問題は、Cookie をできるだけ安全に保護する方法です。

  1. http の代わりに httpsを使用し、ユーザーに https の使用を強制します。このように、Cookie はクリア テキストとして送信されず、盗聴によって盗まれることはありません。

  2. secureCookie に属性を設定して(ウィキペディアを参照)、Cookie を https にバインドし、http 経由で転送されないようにします。

  3. HMAC などのある種のメッセージ認証ダイジェストを使用して、Cookie が改ざんされていないことを確認します。

  4. 必要に応じて、クライアントの IP アドレスを Cookie に埋め込み、特定の IP から送信された場合にのみ受け入れることができます。残念ながら、これにより、時々 IP アドレスが新しく割り当てられるプロキシ サーバーやダイヤルアップ接続で問題が発生する可能性があります。

  5. 最後になりましたが、特定の時点で 1 つのトークンを 1 回だけ使用できるようにします。ユーザーが 2 番目のマシンで同じトークンを使用してログオンする場合は、接続を拒否するか、最初のマシンのセッションを終了します。

お役に立てれば ...

PS: 申し訳ありませんが、TCPの部分をスキップしました。もちろん、私が書いたことのほとんどは http にのみ適用され、TCP には適用されません。とにかく、#3、#4、#5など、とにかく役立つものがあります。

于 2013-01-03T18:55:00.747 に答える