3

私の会社は、中程度の機密情報 (つまり、口座番号ではなく財務情報) を返す RESTful API を構築しています。私は RESTful API コード/サーバーを制御しており、Android アプリも構築しています。私は認証コード許可フロー (クライアント ID とシークレット) で OAuth 2 を使用するように API をセットアップしました。クライアントとプロバイダーの両方を所有しているため、クライアントを承認する必要なくユーザーを自動承認します。私たちは SSO に CAS を使用しており、ユーザーがログインしてトークンを取得するときの OAuth 2 プロセスの一部として、認証サーバーにこれを使用しています。

Android アプリのデータを保護するためのさまざまな方法を検討しています。クライアントIDとシークレットをデバイスに保存することは絶対にないと結論付けましたが、認証トークンを保存することはうまくいくかもしれないと考えています.根ざした電話)。

ここに私が考えた2つのオプションがあります。どちらも、CAS で保護された一種のプロキシ サーバーが必要であり、API サーバーでダンスを行い、認証トークンを返します。これにより、クライアント ID とシークレットをアプリ コードに格納する必要がなくなります。

ここに私が思いついたものがあります:

1) ユーザーがアプリを起動するたびに、データにアクセスするにはパスワードを入力する必要があります。これは間違いなく最も確実な方法です。これが行われた場合、おそらく便宜上ユーザー ID を保存したいと思いますが、その場合、CAS ログインを使用できませんでした (Web ベースであるため)。バックエンドでヘッドレス ブラウザを使用して、ユーザーを CAS にログインさせ、Android フォームに入力した内容に基づいてトークンを取得できるかもしれませんが、これはハックのようです。ユーザー ID の保存は、Chase アプリが行うことと似ています (たまたまこれを使用している場合)。ユーザー ID は保存されますが、セッション間のパスワードは保存されません。

2) 認証トークンを Android デバイスに保存します。これは安全性が少し劣りますが、ほぼ確実です。ユーザーがアプリを初めて起動するときに、トークンを返すプロキシ サーバーの CAS ログインの Web ページを開きます ( https://developers.google.com/accounts/docs/MobileAppsと同様)。ユーザーがログインし、トークンがアプリに返されたら、トークンを暗号化し、アプリケーションに対してプライベートに保存します。また、ProGuard を使用してコードを難読化し、暗号化アルゴリズムのリバース エンジニアリングをより困難にします。トークンの更新でも作業できますが、これはより誤った安心感になると思います。

3) CAS を使用せずに、サービスの認証トークンを取得する別の方法を考え出します。

他の人が同様のシナリオをどのように実装したかについてのアドバイスはありますか (それが行われた場合)?

ありがとう。

4

1 に答える 1

4

OAuth のような標準が開発された理由は、誰もが同じ攻撃ベクトルを何度も再考する必要があるわけではないからです。そのため、ほとんどの場合、独自のものを作成するのではなく、既に利用可能なものに固執することが最善の選択です。

データを秘密裏に保存できないクライアントの最初の問題は、ユーザーのデータが攻撃者によってアクセスされる可能性があることです。これを防ぐことは技術的に不可能であるため (コードの難読化は専門家の攻撃者に対しては役に立ちません)、OAuth 2のアクセス トークンは通常、短時間で期限切れになり、攻撃者に完全なアクセス権を与えません (スコープによって制限されます)。確かに、そのようなデバイスには更新トークンを保存しないでください。

2 つ目の問題は、クライアントのなりすましです。攻撃者はクライアント シークレットを盗み、自分の (おそらく悪意のある) アプリで API にアクセスする可能性があります。ユーザーは自分でそこにログインする必要があります。そこでの OAuth ドラフトでは、サーバーがこれを防ぐためにできる限りのことを行う必要がありますが、それは非常に困難です。

許可サーバーは、可能な限りクライアントを認証する必要があります。クライアントの性質上、認可サーバーがクライアントを認証できない場合、認可サーバーは、認可応答を受信するために使用されるリダイレクト URI の登録を要求しなければならず (MUST)、そのような潜在的に悪意のあるクライアントからリソース所有者を保護するために他の手段を利用する必要があります (SHOULD)。たとえば、認可サーバーは、クライアントとそのオリジンの識別を支援するために、リソースの所有者を関与させることができます。

アプリケーションの署名をチェックすることによって、そのようなデバイスでクライアントを認証する別のアプローチを試みたのは Google が最初だと思いますが、まだ準備が整っていません。そのアプローチについてさらに洞察が必要な場合は、こちらの回答を参照してください。

今のところ、最善の策は OAuth の方法にとどまることです。つまり、アクセス トークンクライアント IDクライアント シークレット(認証コード グラント フローを使用する場合) をデバイスに保持し、追加のチェックを行うようにサーバーを構成します。これらを難読化する方が安全だと思う場合は、それを行ってください。ただし、これらの値が公開されているかのように常に考えてください。

于 2012-08-17T20:18:08.270 に答える