表題の件について質問致します。  
アプリ作成の際にGoogleのMapを利用することがありました。  
書籍などを参考に作成を行い，その中で”証明書のフィンガープリントからAPIのキーを取得する”という手順がありました。  
記述されていた手順で無事にアプリの作成は出来ましたが，この手順で何が行われているかが理解できておりません。  
ご教授，よろしくお願い致します。
CC BY-SA 3.0
2015-02-23T22:46:39.320
6985
2015-02-24T07:19:55.200
8142
question
android google-play-service
GoogleMap等を利用する際に取得する証明書のフィンガープリントとAPI Keyとは？
Googleは誰が（どのアプリが）APIを利用しているのかを把握する必要があります。この「誰が」を識別するのが「APIキー」と呼ばれる文字列です。APIの利用状況は課金などにも関わってくるため、他人に自分のAPIキーを使われないよう秘密にしておかなければいけません。

しかしユーザーの手元に置かれるアプリの場合、APIキーを含んだアプリをユーザーは自由に解析することができるため、このAPIキーが盗まれる可能性があります。「キーを盗まれないようにする」というのは難しいことなので、代わりに「そのAPIキーに紐づけられたアプリである証拠」を求めることにしました。これが「証明書のフィンガープリント」と「パッケージ名」です。  
※Androidアプリ以外の場合は別の証拠を使います

Androidアプリを実機にインストールする際には必ずデジタル署名をしなければなりません。このとき使われる秘密鍵と証明書はそのアプリの開発者しか持っていませんから、誰かが同じ名前のアプリを作ったとしても同じ署名を持つアプリを作ることは困難です。この方法では鍵そのものを埋め込む必要もないので、配布されたアプリから盗まれるリスクも小さいです。

証明書のフィンガープリントは証明書から算出される固有の値で、違う証明書や改ざんされた証明書では異なる値が出るようになっています。AndroidアプリやJavaのデジタル署名に使う証明書は
`keytool` というツールで管理しますから、このツールを用いてフィンガープリントも計算します。

デジタル署名に使う鍵は複数のアプリで同じものを使えるので、「パッケージ名」も併せて登録します。これによりアプリ間でAPIキーを使いまわすことを防止できますが…その理由はよくわからないです。

## 参考

  * [Getting Started - Google Maps Android API v2 — Google Developers](https://developers.google.com/maps/documentation/android/start?hl=ja#get_an_android_certificate_and_the_google_maps_api_key)
  * [Androidの署名を理解する - kotaroito's notes](http://kotaroito.hatenablog.com/entry/20120821/1345518079)
  * [フィンガープリントとは 【 finger print 】 - 意味/解説/説明/定義 ： IT用語辞典](http://e-words.jp/w/E38395E382A3E383B3E382ACE383BCE38397E383AAE383B3E38388.html)
CC BY-SA 3.0
2015-02-24T07:19:55.200
7017
2015-02-24T07:19:55.200
8000
6985
answer