パスワードデータは1つのファイルに格納しています。
このファイルは超重要です。もちろん、読み取られないようにデータは色々と暗号化しています。
なにより自分が使うアプリですから、自分が出来る限りの安全性を盛り込みました。
なんなら、仕事で頼まれる市販のツールより安全性を高めています☺
データはローカルとクラウド両方にもたせる
データはローカルとクラウドサーバー、両方に存在します。
これはなんらかのトラブルでネットに接続できなくても、アプリを使えるようにするためです。
「うっかり Google アカウント消しちゃった」なんてヒューマンエラーも、人間である限りゼロではありませんので。
なお、クラウドを一切使わないローカルストレージのみの使い方も可能になっています。
各種端末で同期を取らない、ディスクはミラーリングしているのでデータ欠損の心配もない等、条件が整っていれば、データはローカルのみの方がより安全です。
ハードディスクは壊れるものなので、バックアップなしの「ローカル使用」はオススメできません。
暗号化
クラウドにデータを保管する以上、このデータを第3者から読み取られないような形にする必要があります。
そうすることで、万が一データを盗まれても安全……と安心できるのです。
手の内を全部書くと全然安全じゃなくなるので💦 なんとなく概要だけ説明します。
クラスメンバーをバイナリに変える
クラスを json で視覚化すればこういうデータ。
{ "GUID": "87ecd5c4-c916-444a-b0ef-9407153afeac", "Title": "a8", "SubTitle": "", "Url": "http://www.a8.net/", "Tag": "", "Subs": [ { "Name": "ID", "Data": "xxxxx2" }, { "Name": "pass", "Data": "aksesa\"#ed0w" }, { "Name": "#", "Data": "1" } ], "Memo": "ID: 99999999\n http://www.a8.net/a8v2/asReminderAction.do", "UpdateTime": "2022-12-28T23:22:59+09:00" },
これを、クラスデータのままバイナリ化してしまいます。
その後、暗号化します。
暗号に必要なパラメータをあちこち(固定位置ではない)に分散させます。
ファイル mipass.pkey の中だけではなく、「あちこち」です。
暗号化する前に圧縮する
これは暗号強度が上がるわけではありませんが、データサイズを縮小するためにはいい方法です。
なお、暗号化してから圧縮するとほぼサイズは変わらないので注意してください。
ローカルの場合それほど気にならないサイズも、クラウドと同期するのであれば意識しておいた方がいいでしょう。
とはいえ、元々データサイズが小さいので、あまり効果はありませんでした……。
クラウドデータを非同期に読み込む
Google Cloud との接続を行う場合、たった 2KB 程度のデータアクセスでも、数秒はかかってしまいます。
データ1件入れたり、ちょっと変更するたびに数秒待たされるのは避けたいですよね。
そのため、クラウドとのアクセスは非同期で行うようにしています。
アクセス中はインジケータが回りますが、その間もユーザーはアプリを使うことが出来るので、ノーストレスです。
非同期処理はプログラムとしては難易度の高い部類に入ります。
出来れば使いたくないです! ……でも、ネットにアクセスする処理のほとんどは応答にかなり時間がかかってしまうので、実装できるかどうかで UX に随分差が出ます。
非同期の難しさのは「どこで非同期を使うか」「上手くいかなかった時どうハンドリングするか」の見極めだと思っています。
この設計が甘いと、いかにロジックを理解していても後々致命的なバグ(10~10000 回に1回でるとか、そういう辛いやつ)を残してしまいます。
エラーは出るものと割り切って「それでも正常動作するには」という実装をすることもあるでしょう。
今回のロジック
今回のロジックでいえば、まずデータ内にデータ破損チェッカー(CRC)を入れ、壊れたデータを取り込まないよう工夫しています。
また、ローカルとクラウド両方にデータを持っている場合、2つ同時に破損する確率はかなり低いでしょう。
ローカルデータはアクセスが一瞬なので、そもそも破損する頻度が低いです。
もちろん、10 年選手の HDD とか使わないでくださいね☺
また、データは1行ずつローカルとクラウドを比較し、新しい方を採用しています。
ファイル単位ではないため、AとBの端末でデータ入れたら、Bが消えちゃった……といった被害も構造的に起こり辛いです。
苦労した甲斐あって……
個人製作アプリの割には色々と細かい仕掛けを施しましたが、自分で使っている分には特に問題なく使えております。
データが急に消えるといった問題は 99% ないと思いますが、細かい問題はまだまだあると思います。
可能であれば、mipass.pkey を時々バックアップするなど、より安全にお使いいただけると幸いです。