# Mastodon

この記事の内容は2020年7月頃のものです。

MastodonはActivityPub (opens new window)Server to Server Interactions (opens new window)に準拠した分散ソーシャルネットワークサービスのひとつです。分散ソーシャルネットワークサービスでは、ユーザーを代理して、ユーザーがログインしていない場面で、サーバどうしが投稿をやりとりしますので、投稿内容を検証しなりすましを防ぐ必要 (opens new window)があります。Mastodonの詳細については、紹介サイト (opens new window)(右上のメニューから日本語にできます)を参照してください。

# HTTP署名した投稿の配送

Mastodonでは、アカウントの作成時にOpenPGP鍵を生成しておき、他のサーバに投稿を配達する際に投稿元のアカウントの私有鍵で投稿内容にデジタル署名します。このHTTP署名については、IETFで標準化に向けて議論が続けられています (opens new window)。配達先のサーバは、投稿元のアカウントの公開鍵を投稿元のサーバから取得することで、投稿内容の正当性を検証します。

# ダイレクトメッセージのエンドツーエンド暗号化

開発版のMastodonではダイレクトメッセージをエンドツーエンド暗号化するAPI (opens new window)が利用可能です。このAPIはMatrixのエンドツーエンド暗号化 (opens new window)に似た手順エンドツーエンド暗号化を実現するもので、クライアントデバイスは下記の手順でエンドツーエンド暗号したダイレクトメッセージを送信します[1]。サーバに知られることなく共通鍵を算出することで、サーバにダイレクトメッセージの内容を知られることなく、クライアントデバイスどうしでのダイレクトメッセージをやりとりします。

  1. クライアントデバイスでデジタル署名と共通鍵生成用の2ペアの鍵対を生成し2つの公開鍵をサーバにアップロードしておく。また、いくつかのワンタイム鍵対を生成し公開鍵をサーバにアップロードしておく
  2. ダイレクトメッセージの送信先のユーザーのクライアントデバイスのリストを公開鍵と共に取得する
  3. 今回のセッションのためにダイレクトメッセージの送信先のクライアントデバイスのワンタイム鍵を取得する
  4. 今回のセッションのためにワンタイム鍵を生成する
  5. 取得した送信先のワンタイム鍵・手元で生成したワンタイム鍵・送信先と手元の共通鍵生成用から、今回のセッションのために共通鍵を算出する
  6. 生成した共通鍵で暗号化したダイレクトメッセージをサーバ経由で送付する

  1. クライアントアプリ開発の混乱を防ぐため、このAPIで送る暗号化メッセージの内容について同意が形成されるまで、このAPIエンドポイントは無効化 (opens new window)されました ↩︎