web-dev-qa-db-ja.com

iOSでは、サーバーと通信できるようにする秘密の「キー」をどのように保存できますか?

REST APIリクエストのヘッダーで使用する秘密キー( "abc123")を保存します。サーバーはこの秘密キーをチェックします。 "abc123"に一致する場合、リクエストを許可します。

私は次のような簡単な解決策を考えています:

let secret = "abc123" 

しかし、これには何か問題があるのでしょうか?

28
TIMEX

狂ったように聞こえますが、これがおそらく最良のソリューションです。他のすべてはより複雑ですが、安全性はそれほど高くありません。あなたが使用する派手な難読化技術は、このキーが見つかるとほぼ同じくらいすぐにリバースエンジニアリングされます。しかし、この静的キーソリューションは非常に安全ではありませんが、他のソリューションとほぼ同じくらい安全であり、余分な複雑さはほとんどありません。大好きです。

ほとんどすぐに壊れますが、他のすべてのソリューションも壊れます。シンプルにしてください。

ここで本当にやりたいことの1つは、HTTPSと 証明書の固定 を使用することです。そして、Wordではない長くてランダムなキーを選択します。理想的には、バイナリではそれほど目立たないように、文字ではなく生の値として保存された完全にランダムなバイト文字列である必要があります。クレイジーにしたい場合は、SHA256を適用してから送信します(実際のキーはバイナリに表示されません)。繰り返しますが、これは簡単に破れますが、簡単であり、開発に多くの時間を無駄にしません。

この機能を実装するのに1時間以上の労力を費やすだけの価値があるとは考えられません。このトピックについてさらに詳しく知りたい場合は、 iPhoneアプリからWebページへのセキュアなhttps暗号化 とそのリンクを参照してください。

24
Rob Napier

アプリ内の文字列をハードコーディングすることにより、攻撃者はバイナリを解読し( dumpdecrypt などのツールを使用)、問題なく文字列を取得できます(単純なhexdumpにはアプリ内の文字列が含まれます)。

これにはいくつかの回避策があります。エンドポイントを実装することができますREST APIは、資格情報を返し、起動時に呼び出すことができます。もちろん、これには独自のセキュリティ上の問題があり、追加のHTTP呼び出しが必要です。 。私は通常こうしないでしません。

別のオプションは、何らかの方法で秘密鍵を難読化することです。そうすることで、攻撃者は復号化後すぐにキーを認識できなくなります。 cocoapods-keys は、この方法を使用する1つのオプションです。

ここには完璧な解決策はありません。できることは、攻撃者が鍵を手に入れるのを可能な限り難しくすることです。

(また、リクエストを送信するときは必ずHTTPSを使用してください。そうしないと、キーを侵害する別の良い方法になります。)

6
Sam

インバンドトークンは一般に一部のスキームで使用されますが、おそらく最終的にはネットワークトラフィックとトークンを保護するためにTLSを実装することになるでしょう。 ロブ・ネイピアが別の返信で言及しているように

ここで独自の証明書チェーンを使用すると、既存のTLSセキュリティおよび認証メカニズムとiOSキーチェーンの使用が可能になり、(必要な場合)TLS資格情報を取り消すオプションも提供されます。サーバーになり、必要に応じてサーバーのなりすましを検出します。

独自の認証局と独自の証明書チェーンは無料であり、独自の証明書は、ルート証明書をクライアントにロードすると、商業的に購入した証明書と同じくらい安全です。

つまり、この証明書ベースのアプローチは、既存のTLSメカニズムを使用して、暗号化と認証を組み合わせます。

2
Stephen Hoffman

アクセストークンを使用しているようです。アクセストークンにキーチェーンを使用します。クライアントIDの場合、アクセストークンはユーザーごとに、または更新トークンとキーチェーンごとに変化してもクライアントIDは変わらないため、変数として保持します。ユーザー資格情報を保存する安全な場所です。

0
Gasim

サーバー環境パラメーターとして保存された変数の値をアプリで取得できるPFConfigオブジェクト(辞書)を使用しました。
RubyまたはPHP。 Rubyまたは同様。

PFConfig.getConfigInBackgroundWithBlock{
      (config: PFConfig?, error: NSError?) -> Void in
      if error == nil {
        if let mySecret = config["mySecret"] as? String {
          // myFunction(mySecret)
        }

    }
0
lguerra10