lesson-1_ノートを暗号化する方法を考えよう
🎓 ノートを暗号 化する方法を考えよう
実装の前に、どのような仕組みでノートを暗号化するか考えてみましょう。暗号化の方法はいくつかありますが、このコンテンツでは共通鍵暗号という方法を使用します。
共通鍵暗号とは
共通鍵暗号(別名:対称鍵暗号、秘密鍵暗号)は1つの鍵(対称鍵)を用いて情報を暗号化・復号する方法です。特徴としては、計算量が少ないために高速に動作することが挙げられます。また、暗号化と復号に同じ鍵を使用するため、鍵の管理が容易です。
仕組みは非常にシンプルです。
- 対称鍵を生成する。
- 対称鍵でノートを暗号化する。
- 暗号化されたノートをバックエンドキャニスターに保存する。
- 対称鍵でノートを復号する。
ここで課題となるのは、異なるデバイスでノートを共有したいときです。
なお、このコンテンツではブラウザをデバイスとして扱い、異なるデバイスとは、ストレージ空間を共有しない別のブラウザアプリケーションやシークレットブラウザ(またはプライベートブラウジングモード)を指します。
異なるデバイスでノートを共有する場合、対称鍵を共有する必要があります。しかし、対称鍵をそのままの状態で受け渡しすることはセキュリティ上の問題があります。
では、どのように対称鍵を共有すれば良いでしょうか? その方法として、公開鍵暗号という方法があります。
公開鍵暗号とは
公開鍵暗号は、暗号化と復号に異なる鍵を使用する暗号方式です。暗号化用の鍵は誰に知られても良い公開鍵、復号用の鍵は自分だけが知っている秘密鍵といいます。公開鍵と秘密鍵(キーペア)には密接な関係があり、たいていの公開鍵暗号は秘密鍵から公開鍵を作ります。しかし公開鍵から秘密鍵は作れません。そのため、公開鍵は他人に知られても問題はなく、この性質を利用して対称鍵を共有したいと思います。
公開鍵暗号を使用して対称鍵を共有する方法を、簡単な図で説明します。
- 公開鍵と秘密鍵を生成する。
- 公開鍵をバックエンドキャニスターに保存する。
- 対称鍵を持っているブラウザが、バックエンドキャニスターに保存された公開鍵を取得する。
- 公開鍵で対称鍵を暗号化する。 取得したそれぞれの公開鍵を使用して、対称鍵を暗号化します。暗号化された対称鍵は、バックエンドキャニスターに保存されます。
- 自身の公開鍵で暗号化された対称鍵を取得する。 秘密鍵で暗号化された対称鍵を復号します。
これで、対称鍵を共有することができました!
必要な機能を整理しよう
先ほどの仕組みを実現するために必要な機能を整理しましょう。
対称鍵を共有するまでの流れは、大きく分けると以下のようになります。
- データの生成
- データの保存
- 対称鍵の同期
1. データの生成
まずは、データの生成です。以下の3つのデータが必要です。
1. デバイスエイリアス
これは、各デバイス(ここではブラウザ)を一意に識別するために使用します。
2. 対称鍵
この鍵はプリンシパル1つに対し1つとします。
3. 公開鍵と秘密鍵
これは、対称鍵を暗号化するために使用します。各デバイスがそれぞれ生成します。
上記3つのデータは、フロントエンド側で生成します。
2. データの保存
データの保存場所には、ブラウザのローカルストレージとバックエンドキャニスターを使用します。先ほど挙げた3つのデータは、それぞれ以下のように保存します。
- デバイスエイリアス
ブラウザのローカルストレージと、バックエンドキャニスターの両方に保存します。ブラウザのローカルストレージに保存する理由は、ユーザーが再度そのブラウザでアクセスした際に、ローカルストレージに保存されたデータを確認することで簡単に該当デバイスとして識別できるようにするためです。バックエンドキャニスターに保存する理由は、ユーザーがどのブラウザでノートを共有しているのかを一元管理するためです。
- 対称鍵
フロントエンドのコード内、鍵を扱うクラスのメンバーとして保 存します。
- 公開鍵と秘密鍵
ブラウザのローカルストレージに保存します。また、公開鍵のみバックエンドキャニスターにも保存します。これは、対称鍵の同期時に使用するためです。
3. 対称鍵の同期
繰り返しとなりますが、対称鍵の同期は以下の流れで行います。
- 公開鍵のアップロード
- 対称鍵を保有するブラウザが、バックエンドキャニスターから公開鍵を取得
- 公開鍵で対称鍵を暗号化
- 暗号化された対称鍵をバックエンドキャニスターにアップロード
- バックエンドキャニスターから暗号化された対称鍵を取得
🙋♂️ 質問する
ここまでの作業で何かわからないことがある場合は、Discordの#icp
で質問をしてください。
ヘルプをするときのフローが円滑になるので、エラーレポートには下記の4点を記載してください ✨
1. 質問が関連しているセクション番号とレッスン番号
2. 何をしようとしていたか
3. エラー文をコピー&ペースト
4. エラー画面のスクリーンショット
次のレッスンに進み、デバイスデータの登録・削除機能を実装しましょう!