目的

最近はスマホのアプリ側で、個人情報などの機密データを取り扱うことも多くなってきました。
そのことによる制約も多くなってきています。
例えばちゃんと暗号化して、サーバとやり取りしてねとか。

この記事では、そのアプリとサーバ間の暗号化技術についてのメモです。
最適解ではないかもしれないので、ご参考程度にということで。

参考

Common key cryptosystem / Public key cryptosystem 公開鍵暗号では、安全に鍵の情報を保持できるのですが、
処理時間が非常に遅いという問題があります。
ということで、公開鍵方式と秘密鍵方式の両方を使うハイブリッド方式が記載されています。

上記のページの方が図入りで分かりやすい。

公開鍵方式が処理が遅いということは知っていて、これから書く方式は自分らで考えたつもりなのですが。
まぁ、結果として参照先と同じ処理を行っているようです。

対応メモ

スマホアプリとサーバ間の暗号化通信を行う時の手順として、以下の考えに行き着きました。

スマホアプリとサーバ間の暗号化通信
1. アプリ起動時に、RSA公開鍵をサーバからもらう。
2. アプリ起動時に常にAES秘密鍵を作成する。
3. 機密データAが作成されるごとに、アプリで作ったAES鍵で暗号化する。  
4. 3のAES鍵を、1のRSA公開鍵で暗号化する。これはデータAを作るごとに行う。アプリの起動ごとにAES鍵は変わるので。  
5. 3の暗号化したデータAと、4の暗号化した鍵をサーバに送る。  
6. サーバは送られてきた鍵をRSA秘密鍵で復号する。復号したAES鍵でデータAを復号する。  

上記のようにした理由

上記のようにした理由として、以下があります。

秘密鍵暗号方式AESだけで良いんじゃない!?という意見について

スマホからサーバにデータを送信する際に、データを盗聴されると容易に復号されてしまう。
あとスマホ自体が盗難にあった際に、AESだけだと復号されてしまう。

公開鍵暗号方式RSAだけで良いんじゃない!?という意見について

参考の部分で言ったとおり、データAのサイズが大きくなると、処理負荷が顕著だった。
データAは大きなサイズで、しかも何個も存在する状態だったので、RSAだけでの運用は難しいと感じていた。
AES鍵のサイズだったらまぁ大丈夫かなという具合でした。

メモとしては以上です。