画竜点睛を衝く@mapyo

日々やった事をつらつらと書くブログです

Realmで暗号化して、中身を確認するまで。

暗号化

Realmで暗号化するには、公式のサンプル通り、以下のような感じでやればよい

realm.io

このサンプルの通りだと、毎回ランダムな文字が割り振られてしまうので、一旦文字列をキーにして、byte列に変換して入れる事にする。 実際に使う時はコードに直接書いちゃうと意味ないのでいい感じに見れないところに置く必要がある。

val key = "fadfasdfdsfdassfasdfa…" // 64文字

RealmConfiguration config = new RealmConfiguration.Builder()
  .encryptionKey(key.toByteArray())
  .build();

Realm realm = Realm.getInstance(config);

中身を確認する

さて、実際にどんなデータが入ってるのか中身を確認したい。 中身を確認するには以下の3つの方法がある。

  1. stetho-realmを使う
  2. Realm Browserを使う
  3. Realm Object Serverを使う

順に書いていく

1. stetho-realmを使う

github.com

これを使う。

https://github.com/uPhyca/stetho-realm#integration

この辺のサンプル通りにやれば、普通に使える。(雑

。。。はずなんだけど、僕が作ってるアプリだと見れなかった。。。

https://github.com/realm/realm-java/issues/3700

この辺が関係しているのかも?ゼロから自分で作って試してみたら、普通に見ることが出来たので何かしらの何かが影響して見れなくなっているんだと思う。

2. Realm Browserを使う

Realm Browser

Realm Browser

  • Realm
  • 開発ツール
  • 無料

ざっくりした使い方は以下を参照

blog.techium.jp

ただし、realmファイルを取得するためには、一工夫必要だった。↑の方法では、端末のインストールしたパッケージのデータ置き場に保存しているファイルを、一度どこからでもアクセス可能な領域にコピーする。と書いてあったけど、これがうまくいかなかった。

なので、以下のコマンドでrealmファイルの保存場所から直接自分のMacに落としてきて、開いてる。 Windowsだとどうなるかわからない。。

adb -d shell run-as com.mapyo.sample cat /data/data/com.mapyo.sample/files/default.realm | perl -pe 's/\r\n/\n/' > default.realm

com.mapyo.sampledefault.realmは自分の環境に合わせてよしなに修正してください。

そして、落としてきたrealmファイルをいざ開こうとすると、

The encryption key must be entered as a 128-character string of hexadecimal values.

こういうメッセージが出た。まあ、暗号化した時のやつを入れればいいんだな。という事はわかったのだけど、128文字??16進数??どういう事??という感じでよくわからなかった。

いろいろググると答えを見つけた。

https://teratail.com/questions/52401

暗号化キーのバイト列を16進数で表せばいいだけだった。 Kotlinだとこんな感じ

val key = "3fdafad...." // 64文字

val encryptionKey = key.toByteArray().map {
    String.format("%x", it)
}.joinToString(separator = "")

println(encryptionKey)

ということで、ここで確認出来たキーを入れれば見れた!

3. Realm Object Serverを使う

僕は試してないけど、

exception-think.hatenablog.com

こんな感じでやれば出来るっぽい(雑 Twitterでstetho-realmで見れないー。。。とつぶやいてたら紹介してもらった!! ありがたや!!

所感

stetho-realmが使えると一番便利そうなんだけど、見れなくて切ない。。。