

Androidアプリを開発しており、起動時にAjax通信を用いて  
サーバーに置いてあるAPIを叩き、APIが出力したJSONを取得して  
情報を処理しようとしています。

この時、サーバーに置いてあるAPIには外部からアクセスできないように  
Basic認証をかけていますが、この認証に必要なIDとパスワードをどのように  
アプリに持たせたらいいのでしょうか？

Androidは簡単にデコードしてソースが見れるとのことなので  
IDとパスワードの直書きは論外としてもこの状態で  
どうやって安全に通信するのかがわかりません・・・

なお、このアプリはログイン等を一切せずに、  
通信も完全に見えない裏側で行う必要があります。  
ですので「ユーザーには何もさせずに」というのが大前提になります。

\--- 追記 ---

開発環境はMonacaを使用しており、HTML/Javascriptを使用したアプリです。  
APIはPHPで作成し、WordPressの情報を取得・加工し返します。

目指す「安全性」は現時点ですと、とりあえず可能な限り高めておきたいという程度です。  
というのも、今回サーバーに置いてあるAPIとは、入力を一切利用せず  
特定のSELECTを行った結果を加工しJSONで返すだけの簡単な物です。  
更に、その内容も個人情報や機密情報の類は一切扱っておりません。

個人的には、今はこれだけならあまり問題ないように思いますが  
APIという口ができてしまう以上、今後の為にも極力安全な作りにしておきたい。  
と思った次第です。


CC BY-SA 3.0
2016-07-05T06:32:11.993
27350
2016-10-07T09:04:00.227
2016-07-05T08:00:40.497
17063
17063
question
javascript android php api
スマホアプリとAPIの安全な通信方法について


Basic認証がそもそも簡易的なセキュリティです。そんなに高度なセキュリティを維持できません。  
アプリ内部でIDとパスワードを保持する限り、root化すれば閲覧することが可能です。

OAuth認証などを検討してください。  
以下が参考になると思います。

[Basic認証とOAuth - Qiita](http://qiita.com/r7kamura/items/69904137ea20b6b86822)

また、SELECT文を発行するとのことなので、SQLインジェクションを防ぐ事を意識してAPI設計をおすすめします。

[SQLインジェクション対策の極意はSQL文を組み立てないことにあり](https://codezine.jp/article/detail/9204)


CC BY-SA 3.0
2016-07-19T03:42:35.020
27723
2016-07-19T03:42:35.020
354
27350
answer


観点の一つとして、アプリで「通信の内容を秘密にする」のではなく、サーバー側で「怪しい通信はブロックする」対応を入れておくのも重要かと思います。

実際に業務でWebアプリケーションを運用していますが、ログを見ていると怪しい通信というのはいくらでも飛んできます。ご認識の通り、アプリは.apkを解凍してデコードしてしまえばソースを見ることができますし、proguardで難読化しても文字列部分までは変えられないので、URLやリクエストパラメータはすぐにバレてしまいます。

同一IPからの不自然な大量リクエストは弾く、想定外のAPIの叩かれ方があったらエラーを返す、SQLインジェクションに対処する、等のサーバー側の努力も一緒に検討すると良いかと思います。


CC BY-SA 3.0
2016-10-06T10:41:55.097
29391
2016-10-06T10:41:55.097
18895
27350
answer


Monacaの暗号化については  
[技術情報: Monacaアプリのコードを暗号化。Cordova crypt file
pluginを試す](https://ja.onsen.io/blog/monaca-crypt-plugin-review/)が参考になるかもしれません。

(なお、Basic認証やOAuthでWordPressのデータを取るのにもWP-
APIを適切に利用すればSQLインジェクション等を可能にする可能性を減らせるかも知れません。)

いずれによる認証にせよ、TLS通信は必須ですね。それでもProxyかけて無理やり傍受することは可能かもしれないですし、暗号が複合できないかと言えば実行するためにどうこうしてるなら…………となりますが…………


CC BY-SA 3.0
2016-10-07T09:04:00.227
29415
2016-10-07T09:04:00.227
2376
27350
answer