【入門編】 モバイルアプリにおける暗号化データの不適切な保存(SharedPreferences/Plist) – 暗号理論・認証基盤 & エンドポイントセキュリティ防御ガイド

スマホの中に「合鍵」を置きっぱなしにしていませんか?アプリ開発者が知るべき暗号化の基本

こんにちは。セキュリティの現場で日々、攻撃者との「いたちごっこ」を繰り返しているエンジニアです。

今日は、皆さんが毎日何気なく使っているスマートフォンアプリの裏側にある「データの守り方」についてお話しします。特に、「暗号化」と聞くと難しそうに感じるかもしれませんが、身近な「家の防犯」に例えれば、明日からすぐに実践できる知識に変わりますよ。

—

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)に逃がす。

「面倒くさい」と感じるかもしれませんが、一度仕組みを作ってしまえば、それがあなたのアプリの「信頼」という名の最強の盾になります。

まずは、今開発しているアプリの設定ファイルやデータベースのファイルを見てみてください。「あ、これ平文だ!」と気づくことが、セキュリティ向上への第一歩です。一歩ずつ、一緒に学んでいきましょう!

コメント

タイトルとURLをコピーしました