あなたがしたいのは、相互認証されたSSLを使用することです。これにより、サーバーはアプリケーションからの着信接続のみを受け付け、アプリケーションはサーバーとの通信のみを行います。
ここには、高度なアプローチがあります。自己署名入りのサーバーSSL証明書を作成し、Webサーバーに展開します。この目的のために、Android SDKに含まれているkeytoolを使用することができます(Androidを使用している場合は他のプラットフォームでも同様のツールがあります)。次に、自己署名付きのクライアントを作成し、アプリケーション内にリソースとしてカスタムキーストアに配置します(keytoolはこれも生成します)。クライアント側のSSL認証を要求し、生成したクライアント証明書のみを受け入れるようにサーバーを構成します。そのクライアント側の証明書を使用して自分自身を識別し、その部分のサーバーにインストールしたサーバー側の証明書を1つだけ受け入れるようにクライアントを構成します。
アプリ以外の誰かがあなたのサーバーに接続しようとすると、サーバーはあなたのアプリに含まれているクライアント証明書を提示しない受信SSL接続を拒否するため、SSL接続は作成されません。
これは、ここで保証されているよりもはるかに長い答えです。私は段階的にこれを行うことをお勧めします。これは、Web上に、サーバー側とクライアント側の両方で、Androidで自己署名入りのSSL証明書を処理する方法についてのリソースがあるためです。私の本のAndroidアプリケーションの完全なウォークスルーもあります(Application Security for the Android Platform、O'Reilly出版)。
今、あなたは、モバイルアプリにアクセスできる人がクライアント側の証明書に関連付けられた秘密鍵を回復できるという点で正しいです。 BKSキーストアでは暗号化されますが、アプリケーションはそのキーストアを開くためにパスワードを提供する必要があります。だから、誰かがあなたのアプリをリバースエンジニアリングすることができます(Androidプラットフォームではかなり簡単です)、パスワードを取得し、キーストアを取得し、それを解読してクライアント側の秘密鍵を回復します。これを緩和するには、アプリを難読化してキーストアのパスワードを逆転させることを難しくするか、ユーザーにアプリにログインしてそのパスワードを使用してキーストアなどのパスワードを派生させるようにしてください...本当にレベルに依存しますあなたのアプリケーションのために引き受ける意思のあるリスク。