WebSocketを使用してサーバーと通信するWeb(角度)およびiPhoneアプリを実装したいと考えています。過去にHTTPリクエストを使用する場合、リクエストデータ、URL、タイムスタンプなどを使用したハッシュを使用して、リクエストを認証および保護していました。
私が知る限り、WebSocketリクエストでヘッダーを送信できないため、各リクエストをどのように保護できるのか疑問に思っています。
誰にもアイデアや良い習慣がありますか?
サーバーとの安全な通信には、相互の認証が含まれます。 1つの通信チャネルを介して異なる認証資格情報を持つ異なるユーザーをチャネル化する必要がある場合(これは最近では珍しいことです)、個別の認証が必要になります。それ以外の場合は、キー配布スキームを考え出す必要があります(アプリがサーバーの公開キーを認識し、サーバーがクライアントの公開キーを把握するためのプロトコルを持つように、これには多くのパターンがあります)。
これを行うには、SSLまたは独自の暗号よりも少し広い選択肢の勾配があります(独自の暗号を書かないようにしてください)。
スタックのWebサーバーからブラウザーへの部分については、SSLが唯一の選択ですが、SSLは良い安全対策と見なされるべきではありません。毎年、ますます脆弱性、暗号劣化のケース、信頼の問題が発生します。悪いエンジニアリングの決定と緊急の修正の20年の荷物を運んでいるので、もしあなたがより良いものを手に入れることができれば-そうする価値があります。それでも、通常のWebの場合は何もないよりもはるかに優れています。
モバイルアプリでは、いくつかの暗号化ライブラリの1つを簡単に使用して、サーバーとの安全なセッションメッセージングを提供します。
https://github.com/mochtu/libsodium-ios 、libsodium-ios、NaClのiosラッパー、1つECC暗号化の多くの新しい実装を備えた最新の最高の暗号化ライブラリは、学界で高く評価されており、あらゆる状況で最高のパフォーマンスを発揮することに熱心な狂人によって書かれています(要するに、私はそれを崇拝します:))。
Themis、私が貢献しているプロジェクト、私たちのライブラリの非常にObjCフレンドリーなiOSバージョン、および安全なトラフィックを行うための便利なチュートリアルがありますiOSのwebsockets: https://www.cossacklabs.com/building-secure-chat
メッセージを保護するには、SSL/TLS経由のWebSocketを使用します(ws://ではなく、wss://)。独自の暗号を転がさないでください。
認証に関して。 HTTPとWebSocketsの大きな違いは、HTTPはステートレスプロトコルであり、WebSocketsはそうではないことです。
HTTPでは、リクエストごとにヘッダー(Cookie、トークンなど)を送信する必要があります。 WebSocketsを使用して、接続を確立します。最初の対話では、クライアントを認証できます。接続の残りの部分では、クライアントが認証されていることがわかります。
Herokuの人々は、クライアントがHTTPを使用して認証し、チケットを取得し、そのチケットをWebSocket接続を介して最初のメッセージとして送信するパターンを説明しています。 https://devcenter.heroku.com/articles/websocket-security を参照してください
SSL/TLS wss://接続に同意します。常に暗号化されたトラフィックを使用します。認証を実装するにはいくつかの方法があります。こちらをご覧ください: http://simplyautomationized.blogspot.com/2015/09/5-ways-to-secure-websocket-rpi.html
ほとんどすべての例でpythonまたはnodejsを使用し、Raspberry Pi向けになっていますが、一般的な概念を検討することをお勧めします。認証ヘッダーへの認証(SocketShuttle)。