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](http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/javax/crypto/SecretKey.html "javax.crypto 内のインタフェース") を実装してるんだから、うまく動いてくれよ。
後、**com.android.**org.bouncycastle.jce.provider.JCEPBEKey の太字部位が出力されるのってバグじゃないの?
</guchi>
解決方法は
`secretKey = new SecretKeySpec(secretKey.getEncoded(), ARGOLISM);`
を先ほどのコードのDB書き込み直前(コードの //here の箇所)に追加して問題解決。
注意:saltの値は上記では簡易てますが、本当に使う場合はきちんとランダム値を生成するように変更してください。
Read other posts
日記
(84)
読書メーター
(36)
worklog
(34)
google
(13)
大晦日
(13)
android
(11)
blogger
(9)
dynamicsax2009
(8)
mac
(8)
signature
(6)
baby
(5)
flash
(5)
impro
(5)
写真
(5)
技術
(5)
javascript
(4)
一眼レフ
(4)
4.2
(3)
biztalk2009
(3)
eclipse
(3)
jb
(3)
jb_mr1
(3)
lmde2
(3)
oracle
(3)
rsgt
(3)
web
(3)
windows
(3)
4.1
(2)
4.3
(2)
ant
(2)
coaching
(2)
docker
(2)
essay
(2)
factoryreset
(2)
game
(2)
ics
(2)
java
(2)
jb_mr2
(2)
linux
(2)
orsc
(2)
vb.net
(2)
vbscript
(2)
wtcc
(2)
スーパー耐久
(2)
勉強会
(2)
応用演劇
(2)
読書ノート
(2)
資格
(2)
随想
(2)
4.4
a77
advent-calendar
amazon
ansible
azure
bash
ble
bluetooth
book
c++
camera
coach
cp+
creative-process
docker-registry
event
facilitation
feedback
firefox
flickr
forum-theatre
galaxy
gingerbread
git
gpu
hello-world
india
kitkat
laos
laravel
linux-mint
microphone
misstake
opengrok
pdm
phpunit
postgresql
presentation
rsgt2016
rust
scrum
scrum-fest-osaka
scrum-gathering
security
serverside
smartphone
speaker
sprint-review
sqlite
ssh
tomcat
tool
trip
ts
twitter
ubuntu
ubuntu16
vb6
visa
weblogic
wfh
wikka
windows-10
windows-7
windows2008server
x++
デザイン思考
パターンランゲージ
ラオス
ラオ語
修理
演劇教育