Androidの署名を理解する
あまりにも初歩的すぎて恥ずかしいが、調べたことをきちんとアウトプットしておく。
デジタル署名
文書の送信者を証明し、また、改ざんされていないことを保証するためのもの。
アプリケーションまたはコードへの署名というのは、指定されたアプリケーションに対し、秘密鍵を使ってデジタル署名するプロセスを指します。このプロセスの目的は以下のとおりです。
* コードの作成者を識別する
* アプリケーションが変更されていないかどうかを検出する
* アプリケーション間の信頼関係を確立する
この信頼関係により、アプリケーション同士がセキュアな方法でコードとデータを共有することができます。
http://www.ibm.com/developerworks/jp/xml/library/x-androidsecurity/
が説明として分かりやすい。
なぜデジタル署名が必要か?
Android Appはリバースエンジニアリングが(ある程度)容易で、偽装が可能なことに起因する。アプリアップデート時には署名が前バージョンと同じであることを要求される。
署名手順
- keytoolコマンドで証明書を作成
- jarsignerコマンドでapkを署名
というのが一般的な手順らしい。
http://www.adamrocker.com/blog/232/signing_for_publish_android_application.html
関連ファイル
- META-INF/MANIFEST.MF
- META-INF/*.SF
- META-INF/*.RSA
署名検証
jarsigner -verify -verbose -certs target.apk
おまけ: 暗号化と署名は違うよ
RSAアルゴリズムはたまたまどちらにも使えるから混同しがちだが、そもそも目的が違うよねという話。
http://www.machu.jp/diary/20080302.html#p01