AzureでクラウドサービスとしてホストされるC#を使用してRESTWebサービスを実装しています。これはRESTサービスであるため、ステートレスであり、Cookieやセッション状態はありません。
Webサービスには、HTTPS(StartSSL.comによって提供される証明書)を介してのみアクセスできます。
ユーザーがサービスに正常にログインすると、セキュリティトークンを取得します。このトークンは、将来の通信で認証を提供します。
トークンには、クライアントのタイムスタンプ、ユーザーID、およびIPアドレスが含まれます。
すべての通信はHTTPSを介してのみ行われるため、トークンが傍受されてリプレイ攻撃で使用されることは心配していません。とにかくトークンには有効期限があります。
ただし、これは公開サービスであるため、誰かがサービスに登録し、ログインして、受け取ったトークンを変更して他のユーザーのアカウントにアクセスする可能性があるのではないかと心配しています。
トークンのコンテンツを保護し、改ざんされていないことを確認するための最善の方法を考えています。
トークンを保護するために、次のことを行う予定です。
クライアントはサービスに正常にログインし、サービスは次のことを行います。
- ランダムな値を生成し、SHA256で1000回ハッシュします。
- 秘密鍵+ハッシュされたランダム値からワンタイムセッション鍵を生成します。
- SHA256でセッションキーを1000回ハッシュし、それを使用してトークンを暗号化します
- 秘密鍵を使用して、RSAを使用して暗号化されたトークンに署名します。
- 暗号化されたトークン+署名+ハッシュされたランダム値を暗号化されていないJSONパッケージでクライアントに送信します。
クライアントがサービスを呼び出すと、暗号化されたトークンと署名が暗号化されていないJSONパッケージでサービスに送信されます。サービスは
- 秘密鍵+ハッシュされたランダム値からセッション鍵を再作成します
- 秘密鍵を使用して署名を確認します
- ハッシュされたセッションキーを使用してトークンを復号化します
- トークンの有効期限が切れていないことを確認してください
- 要求された操作を続行します...
私は暗号化について何も知らないので、いくつか質問があります。
- これで十分ですか、それともやり過ぎですか?
- 改ざんを検出するには、トークンにHMACを含める必要があることを読みました。秘密鍵で署名しているので、HMACは必要ですか?
- RSAの代わりにRijndaelを使用する必要がありますか?
- Rijndaelが優先される場合、生成されたIVは復号化に必要ですか?つまり、それを捨てることができますか、それとも暗号化されたトークンを送信する必要がありますか?例:暗号化されたトークン+ HMAC +IV+ハッシュされたランダム値。
すべての通信はHTTPSを介して行われるため、暗号化されていないJSONパッケージは、クライアントに到達するまで実際には暗号化されていません。
また、後でPHPでサービスを再実装したい場合もあるので、これはすべてPHPでも実行可能である必要があります。
ご協力いただきありがとうございます