Androidの署名を理解する

あまりにも初歩的すぎて恥ずかしいが、調べたことをきちんとアウトプットしておく。

デジタル署名

文書の送信者を証明し、また、改ざんされていないことを保証するためのもの。

アプリケーションまたはコードへの署名というのは、指定されたアプリケーションに対し、秘密鍵を使ってデジタル署名するプロセスを指します。このプロセスの目的は以下のとおりです。
  * コードの作成者を識別する
  * アプリケーションが変更されていないかどうかを検出する
  * アプリケーション間の信頼関係を確立する
この信頼関係により、アプリケーション同士がセキュアな方法でコードとデータを共有することができます。

http://www.ibm.com/developerworks/jp/xml/library/x-androidsecurity/
が説明として分かりやすい。

なぜデジタル署名が必要か?

Android Appはリバースエンジニアリングが(ある程度)容易で、偽装が可能なことに起因する。アプリアップデート時には署名が前バージョンと同じであることを要求される。

署名手順

  1. keytoolコマンドで証明書を作成
  2. jarsignerコマンドでapkを署名

というのが一般的な手順らしい。
http://www.adamrocker.com/blog/232/signing_for_publish_android_application.html

関連ファイル

  • META-INF/MANIFEST.MF
  • META-INF/*.SF
  • META-INF/*.RSA

詳しくはhttp://d.hatena.ne.jp/urandroid/20110818/1313656536

署名検証

jarsigner -verify -verbose -certs target.apk

おまけ: 暗号化と署名は違うよ

RSAアルゴリズムはたまたまどちらにも使えるから混同しがちだが、そもそも目的が違うよねという話。
http://www.machu.jp/diary/20080302.html#p01