2012/10/01

Androidで共通鍵暗号化でつまづいたので記録に残す

Androidで文字列をセキュアに保存したい場合、
暗号化してsqliteに保存するのがよろしいと思われる。

ここではAndroid自体のセキュリティがアレだとか、Rooted端末とapktoolがあればアレをこうしてアレ出来るだとかいう話はとりあえず置いとく。

まず以下のようなソースを書いた。

内容は、

  • 共通鍵の秘密鍵を生成している箇所のみ抽出。
  • DBに鍵が保存されていない初回はif文を迂回して生成ロジックで生成後DBに保存。
  • DB保存後はDBから復元する。
private final static String ARGOLISM = "PBEWithSHA1And256BitAES-CBC-BC";

private SecretKey getSecretKey()
throws NoSuchAlgorithmException, InvalidKeySpecException, NameNotFoundException {

   // check saved secret key is exist.
   byte[] savedSecretKey = DBHelper.readByteData(context, "hoge");

   if(savedSecretKey != null && savedSecretKey.length > 0){
      return new SecretKeySpec(savedSecretKey, ARGOLISM);
   }

   // generate new secret key.
   char[] pw = generatePassword();
   int iteratorCount = 1024;
   int keySize = 256;
   int saltLength = 8;
   byte[] salt = "00000000".getBytes();

   KeySpec keySpec = new PBEKeySpec(pw, salt, iteratorCount, keySize);

   SecretKeyFactory factory = SecretKeyFactory.getInstance(ARGOLISM);
   SecretKey secretKey = factory.generateSecret(keySpec);

   // here

   // save secret key.
   DBHelper.writeByteData(context, "hoge", secretKey.getEncoded());

   return secretKey;
}
※DBHelperはsqliteへの簡便なアクセスを提供するクラスとする。
ここで使用しているDBHelperの先にあるテーブルはマップのようにkey/valueのデータ構造をしているものとする。

上記実行したところ、
生成後のDBから読み出した鍵が暗号化した鍵とは違うとのExceptionが発生。
secretKey.getEncoded()の値をDB書き込み前と後で見比べてみても同じ。
ワケワカラーン

結局、Exceptionの原因はクラス差でした。
生成前 : com.android.org.bouncycastle.jce.provider.JCEPBEKey
生成後 : javax.crypto.spec.SecretKeySpec

<guchi>
両方共 SecretKey を実装してるんだから、うまく動いてくれよ。
後、com.android.org.bouncycastle.jce.provider.JCEPBEKey の太字部位が出力されるのってバグじゃないの?
</guchi>

解決方法は
secretKey = new SecretKeySpec(secretKey.getEncoded(), ARGOLISM);
を先ほどのコードのDB書き込み直前(コードの //here の箇所)に追加して問題解決。

注意:saltの値は上記では簡易てますが、本当に使う場合はきちんとランダム値を生成するように変更してください。

2012/09/30

[読書メーター]2012年 8月読書まとめ読書メーター

最近は漫画ばかり読んでて小説に手がつけれていない。
それでもビブリア古書堂と森博嗣のVシリーズを読み始めた。

Vシリーズの紅子さんのキャラ立ちっぷりが凄い。
来月も漫画の詰み読に負けずに活字を読む。
というか読みかけの技術書をはやく読了したい。


2012年8月の読書メーター
読んだ本の数:3冊
読んだページ数:1040ページ
ナイス数:10ナイス

ビブリア古書堂の事件手帖 2 栞子さんと謎めく日常 (メディアワークス文庫)ビブリア古書堂の事件手帖 2 栞子さんと謎めく日常 (メディアワークス文庫)感想
古書の薀蓄垂れ流しは相変わらずだけど、それが五月蝿くなく、テンポよくお話が進のがよいです。
読了日:8月26日 著者:三上 延
ビブリア古書堂の事件手帖―栞子さんと奇妙な客人たち (メディアワークス文庫)ビブリア古書堂の事件手帖―栞子さんと奇妙な客人たち (メディアワークス文庫)感想
中古本とは違う古書の世界。その薀蓄を垂れ流す安楽椅子探偵ならぬ、病室本屋が古書にまつわる事件を解きほぐす。淡々と面白いです。
読了日:8月23日 著者:三上 延
黒猫の三角 (講談社文庫)黒猫の三角 (講談社文庫)感想
Vシリーズ初弾。瀬在丸紅子のキャラクタが良い。端的にとても魅力的な女性だと思います。ミステリ部分は?この本に不思議なところなぞ微塵もないからミステリではないと思いつつカテゴリをミステリに分類。やっぱ一級だわ。
読了日:8月3日 著者:森 博嗣

読書メーター

2012/08/13

JBとICSのPermission比較(メーカー署名関係)

以前書いた、ICSとGingerbreadのPermission比較(メーカー署名関係)の続編。


注意:今回の記事は https://android.googlesource.com/platform/manifest/android-4.1.1_r4 を元に書いてます。

またしてもJBで色々と Permission 関係が変わっているのでまとめてみた。
まず プロテクションレベルの表記が変わっている。
以前は signatureOrSystem と書かれていた箇所が signature|system に変更。
また謎の development も追加(詳細がドキュメントされていないので後日調査予定)

まず ICS と JB のプロテクションレベルの一覧比較


ICS

  • dangerous
  • signatureOrSystem
  • normal
  • signature

JB

  • dangerous
  • signature|system
  • normal
  • signature
  • signature|system|development
  • signatureOrSystem

JB に signatureOrSystem が混じっているのは誤表記にあらず。
一個だけ何故か(恐らくミスだと思うけど) signatureOrSystem が混ざっている。

次それぞれのプロテクションレベル毎の比較
JB 方式の書き方だと今回はまとめにくいので、ICS方式で signature と signatureOrSystemでまとめてみる。

[signature]

赤字は追加分、新規追加のみ signatureOrSystem からの格上げなし
android.permission.ACCOUNT_MANAGER
android.permission.HARDWARE_TEST
android.permission.NET_ADMIN
android.permission.REMOTE_AUDIO_PLAYBACK
android.permission.GET_DETAILED_TASKS
android.permission.REMOVE_TASKS
android.permission.START_ANY_ACTIVITY
android.permission.SET_SCREEN_COMPATIBILITY
android.permission.FORCE_STOP_PACKAGES
android.permission.SET_PREFERRED_APPLICATIONS
android.permission.ASEC_ACCESS
android.permission.ASEC_CREATE
android.permission.ASEC_DESTROY
android.permission.ASEC_MOUNT_UNMOUNT
android.permission.ASEC_RENAME
android.permission.DIAGNOSTIC
android.permission.STATUS_BAR_SERVICE
android.permission.FORCE_BACK
android.permission.INTERNAL_SYSTEM_WINDOW
android.permission.MANAGE_APP_TOKENS
android.permission.INJECT_EVENTS
android.permission.SET_ACTIVITY_WATCHER
android.permission.READ_INPUT_STATE
android.permission.BIND_INPUT_METHOD
android.permission.BIND_ACCESSIBILITY_SERVICE
android.permission.BIND_TEXT_SERVICE
android.permission.BIND_VPN_SERVICE
android.permission.BIND_DEVICE_ADMIN
android.permission.SET_ORIENTATION
android.permission.SET_POINTER_SPEED
android.permission.SET_KEYBOARD_LAYOUT
android.permission.CLEAR_APP_USER_DATA
android.permission.GRANT_REVOKE_PERMISSIONS
android.permission.ACCESS_SURFACE_FLINGER
android.permission.BRICK
android.permission.DEVICE_POWER
android.permission.FACTORY_TEST
android.permission.BROADCAST_PACKAGE_REMOVED
android.permission.BROADCAST_SMS
android.permission.BROADCAST_WAP_PUSH
android.permission.CONFIRM_FULL_BACKUP
android.permission.CHANGE_BACKGROUND_DATA_SETTING
android.permission.GLOBAL_SEARCH_CONTROL
android.permission.COPY_PROTECTED_DATA
android.permission.MANAGE_NETWORK_POLICY
android.intent.category.MASTER_CLEAR.permission.C2D_MESSAGE
android.permission.BIND_PACKAGE_VERIFIER
android.permission.ACCESS_CONTENT_PROVIDERS_EXTERNALLY

[signatureOrSystem]

赤字新規追加、青字は削除。
ただし[signature|system|development]への移動だから除外というのは当てはまらないかも。
android.permission.SEND_SMS_NO_CONFIRMATION
android.permission.RECEIVE_EMERGENCY_BROADCAST
android.permission.INSTALL_LOCATION_PROVIDER
android.permission.CONNECTIVITY_INTERNAL
android.permission.MANAGE_USB
android.permission.ACCESS_MTP
android.permission.MODIFY_PHONE_STATE
android.permission.READ_PRIVILEGED_PHONE_STATE
android.permission.WRITE_MEDIA_STORAGE
android.permission.WRITE_SECURE_SETTINGS
android.permission.WRITE_GSERVICES
android.permission.DUMP
android.permission.RETRIEVE_WINDOW_CONTENT
android.permission.SET_TIME
android.permission.WRITE_APN_SETTINGS
android.permission.ALLOW_ANY_CODEC_FOR_PLAYBACK
android.permission.STATUS_BAR
android.permission.UPDATE_DEVICE_STATS
android.permission.SHUTDOWN
android.permission.STOP_APP_SWITCHES
android.permission.BIND_WALLPAPER
android.permission.INSTALL_PACKAGES
android.permission.DELETE_CACHE_FILES
android.permission.DELETE_PACKAGES
android.permission.MOVE_PACKAGE
android.permission.CHANGE_COMPONENT_ENABLED_STATE
android.permission.READ_FRAME_BUFFER
android.permission.REBOOT
android.permission.MASTER_CLEAR
android.permission.CALL_PRIVILEGED
android.permission.PERFORM_CDMA_PROVISIONING
android.permission.CONTROL_LOCATION_UPDATES
android.permission.ACCESS_CHECKIN_PROPERTIES
android.permission.PACKAGE_USAGE_STATS
android.permission.BACKUP
android.permission.BIND_REMOTEVIEWS
android.permission.BIND_APPWIDGET
android.permission.MODIFY_APPWIDGET_BIND_PERMISSIONS
android.permission.GLOBAL_SEARCH
android.permission.SET_WALLPAPER_COMPONENT
android.permission.ACCESS_CACHE_FILESYSTEM
android.permission.CRYPT_KEEPER
android.permission.READ_NETWORK_USAGE_HISTORY
android.permission.MODIFY_NETWORK_ACCOUNTING
android.permission.PACKAGE_VERIFICATION_AGENT
android.permission.WRITE_SECURE_SETTINGS
android.permission.DUMP

その他

今回新規追加のプロテクションレベル signature|system|development と 仲間はずれの signatureOrSystem

[signature|system|development]

青字の二つは signatureOrSystem からそれ以外は dangerous からの格上げ、これのおかげで開発補助系のアプリに影響が出まくる。
android.permission.SET_ANIMATION_SCALE
android.permission.WRITE_SECURE_SETTINGS
android.permission.DUMP
android.permission.READ_LOGS
android.permission.SET_DEBUG_APP
android.permission.SET_PROCESS_LIMIT
android.permission.SET_ALWAYS_FINISH

[signatureOrSystem]

一個だけぽつんとあるミスっぽいやつ。変換ミスかと思ったが以前は無かったものなのでその線は薄いか?内容的に Nexus 7 作った ASUS で足したものかもしれない。
android.permission.UPDATE_LOCK


今回は以上
情報追加次第、色々手出して調べてみます。

2012/07/31

[読書メーター]2012年 6月読書まとめ読書メーター

久しぶりに読書メーターのログを貼ってみる。
最近は調子が悪くて読書がはかどっていない。
6月なぞ一冊だけだったようだ。

やっぱり定期観測は必要だなと再開してみます。
7月からは京極夏彦、森博嗣のおかげで読書欲が復活してきています。



6月の読書メーター
読んだ本の数:1冊
読んだページ数:304ページ
ナイス数:5ナイス

恥知らずのパープルヘイズ -ジョジョの奇妙な冒険より-恥知らずのパープルヘイズ -ジョジョの奇妙な冒険より-
この小説を面白く読めるのは、きっちり一部から五部までを読み通している俺へのご褒美だと”理解”した!
読了日:06月27日 著者:上遠野 浩平,荒木 飛呂彦

2012年6月の読書メーターまとめ詳細
読書メーター

2012/05/18

ドコモのGalaxySIII と世界のGalaxySIIIの違い

GIGAZINEのこの記事を見て勢いで作った。


 「Galaxy S Ⅲ」900万台の事前予約注文が全世界の通信キャリアから殺到、最終的には5000万台も
http://gigazine.net/news/20120518-galaxy-s3-9million-pre-orders/

Galaxy SII がいい子だったので、後継機のGalaxy SIII に期待していたのに、
ドコモさんが微妙に期待を裏切ってくれたのでドコモ販売の SIII とグローバル端末の SIII の比較表を書いてみる。
ちなみに裏切られたのは個人的な期待なので、ドコモから出るGalaxy SIII が粗悪品なわけではない。
人によってはコレはコレでありだ。



データ元:
Docomoサイト
http://www.nttdocomo.co.jp/product/2012_summer_feature/lineup/sc06d.html
Expansys
http://www.expansys.jp/samsung-galaxy-s-iii-unlocked-232009/


青が個人的残念ポイント、薄オレンジが逆。

System

一番の残念ポイントがこれ!
Quad coreじゃないのが痛い。
マルチタスクのAndroidにとって0.1GHzCPUパワーが上がるよりもQuadにしてもらったほうが良い。

Wireless


ドコモの最大の売りはLTE。
ただし売りとなるかは、Android OS のバージョンが 4.0.3 になるか 4.0.4 になるかで変わってくる。
3GとLTEの切り替え処理の最適化が4.0.4で行われているのが理由。
Galaxy SII LTE触ったことがある人なら3GとLTEの切り替えで電池がギュンギュン無くなっていくのを体験したことがある人もいるだろう。


フラグシップ機としてのスタンダード&シンプルな端末を期待していたので、他のおさいふ携帯機能なども残念感が増すばかり。
ただしこれは個人的な感想なので(ry