スマホの中に「合鍵」を置きっぱなしにしていませんか?アプリ開発者が知るべき暗号化の基本
こんにちは。セキュリティの現場で日々、攻撃者との「いたちごっこ」を繰り返しているエンジニアです。
今日は、皆さんが毎日何気なく使っているスマートフォンアプリの裏側にある「データの守り方」についてお話しします。特に、「暗号化」と聞くと難しそうに感じるかもしれませんが、身近な「家の防犯」に例えれば、明日からすぐに実践できる知識に変わりますよ。
—
1. なぜ「平文保存」が危険なのか?:泥棒に鍵を渡すようなもの
皆さんは、家の玄関のドアに「鍵は植木鉢の下です」というメモを貼って出かけますか? 泥棒からすれば、これほど親切なことはありませんよね。
アプリ開発において、SharedPreferences(Android)や Plist(iOS)にユーザーのIDやパスワード、あるいはトークンをそのまま(平文で)保存することは、まさにこれと同じです。
スマートフォンは、実は誰でも中身を覗き見できるリスクを抱えています。
- 物理的な紛失: 端末を落としたら、拾った人はPCに繋ぐだけで中身を吸い出せます。
- 不正なバックアップ: 悪意あるツールがバックアップデータを解析すれば、情報は丸裸です。
「スマホの中だから安心」という考えは捨てましょう。データは常に「泥棒に盗まれる前提」で守るのが鉄則です。
—
2. 暗号化の「共通鍵」と「公開鍵」:使い分けのルール
暗号化には大きく分けて2つのタイプがあります。
- 共通鍵暗号(AESなど): 「金庫の鍵」です。暗号化するときも、復号(開ける)するときも同じ鍵を使います。処理が高速なので、スマホ内の大量のデータを守るのに適しています。
- 公開鍵暗号(RSAやECC): 「郵便受け」です。誰でも入れる(暗号化できる)けれど、中の手紙を取り出せるのは鍵を持っている本人(復号できる人)だけ。通信のやり取りなど、鍵の受け渡しが難しい場面で活躍します。
現場での使い分け:
アプリ内でデータを保存するなら、基本は「共通鍵暗号(AES)」一択です。高速で、かつ適切に管理すれば非常に強固だからです。
—
3. 【実務編】SQLCipherでデータベースを守る
個別の値を暗号化するのも手ですが、それだと「どのデータを暗号化したっけ?」という漏れが生じがちです。そこでプロは、データベースそのものを丸ごと暗号化する SQLCipher を使います。
以下は、Androidで SQLCipher を導入する際のイメージです。
// データベースを開く際にパスワードを渡すことで、
// データベース全体がAES-256で暗号化されます。
SQLiteDatabase.loadLibs(context); // ライブラリの初期化
// 接続文字列にパスワードを組み込む
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(
databaseFile,
"ここに強力なパスワードを入れる", // 本来はAndroid Keystoreで管理すべき鍵
null
);
// これ以降、ファイルに保存されるデータはすべて暗号化された状態になります
ここがポイント!
コード内に直接 String pass = "12345"; と書くのはNGです。これは「鍵をドアの横に吊るしておく」のと一緒です。必ず Android Keystore や iOS Keychain といった、端末特有の「安全な金庫」に鍵を保管してください。
—
4. まとめ:今日からできる一歩
セキュリティ対策は「完璧」を目指すのではなく、「泥棒が諦めるレベル」まで引き上げることが大切です。
1. 平文保存をやめる: SharedPreferences や Plist に機密情報を直接書かない。
2. 暗号化ライブラリを使う: SQLCipher のような、実績のあるライブラリで全体を保護する。
3. 鍵の管理を徹底する: 暗号化のための鍵そのものを、OS標準の安全な領域(Keystore/Keychain)に逃がす。
「面倒くさい」と感じるかもしれませんが、一度仕組みを作ってしまえば、それがあなたのアプリの「信頼」という名の最強の盾になります。
まずは、今開発しているアプリの設定ファイルやデータベースのファイルを見てみてください。「あ、これ平文だ!」と気づくことが、セキュリティ向上への第一歩です。一歩ずつ、一緒に学んでいきましょう!
コメント