web-dev-qa-db-ja.com

アプリケーションのバイナリに秘密のAPIキーを格納する方法は?

Mac OS X用のTwitterクライアントを作成していますが、コンシューマの秘密があります。私の理解では、このsecretキーは共有しないでください。問題は、次のように文字列リテラルとしてアプリケーションに入れて使用することです。

#define QQTwitterConsumerSecret @"MYSECRETYOUMAYNOTKNOW"

[[QQTwitterEngine alloc] initWithConsumerKey:QQTwitterConsumerKey consumerSecret:QQTwitterConsumerSecret];

アプリケーションのバイナリのデータセクションにあります。ハッカーはこれを読んだり、アプリケーションを分解したりできます。

コンシューマシークレットを安全に保存する方法はありますか?暗号化する必要がありますか?

41
user142019

本当の完璧な解決策はありません。あなたが何をしても、それを専門とする誰かがそれを盗むことができます。

Twitter/iPhone/iPad/Android/mac/etc。そこに秘密鍵があります、彼らはおそらくどういうわけかそれを覆い隠しただけでしょう。

たとえば、別のファイルや文字列などに分割できます。

注:16進エディタを使用すると、ASCII文字列をバイナリで読み取ることができます。これが最も簡単な方法です。それをさまざまな部分に分割するか、関数呼び出しを使用して秘密鍵を作成することにより、通常、そのプロセスがより困難になります。

27

Base64エンコードして難読化することもできます。または、より良いアイデアgenerate単に格納するのではなくキー-次のように記述します。

char key[100];
++key[0]; ... ; ++key[0]; // increment as many times as necessary to get the ascii code of the first character
// ... and so on, you get the idea.

しかし、本当に優れたハッカーであれば、何があってもそれを見つけるでしょう。他の人の目からそれを本当に保護する唯一の方法は、安全なハッシュ関数を使用することですが、それからそれを取得することもできません:)

7
user500944

サーバーでのみ実行されないアプリケーションでは、秘密のAPIキーを使用しないでください。

それが完全に隠されている場合でも..いつでも、ネットワークを通過するデータをスヌープできます。そしてそれはあなたのデバイスなので、SSLを改ざんすることもできます(デバイスの信頼できるCAリストに追加されたカスタムCAによって作成された証明書を途中で使用する)。または、SSLライブラリにフックして、実際に暗号化される前にデータを傍受することもできます。

2
ThiefMaster

本当に遅い答え...

独自のサーバーをセットアップすると、秘密鍵を共有(つまり、埋め込み)せずに、Twitter上のユーザーがデスクトップアプリを承認するのに役立ちます。

このアプローチを使用できます。

ユーザーがデスクトップアプリをインストールすると、Twitterとサーバーに登録する必要があります*)*)アプリはサーバーにトークンリクエストURLの生成を要求します*)サーバーは生成されたURLをアプリに送信します*)アプリはユーザーに指示します承認URLに*)ユーザーがTwitterでアプリを承認し、生成されたPINに貼り付けます*)PINを使用して、アプリがトークンを取得します*)以降のすべての通信ではトークンが使用され、サーバーは関与しません

注:アプリは、サーバーのユーザー資格情報(例:IDとパスワード)を使用してサーバーにログを記録します。

0
hawk78