Peering

Peering / ブログ

アカウントなしのペアリング:Peeringが信頼する相手を決める仕組み

多くのリモートデスクトップツールは、2台のデバイスが同じ持ち主のものかを会社が判断できるように、登録を求めます。Peeringは会社を介さず、代わりにあなたに、6桁の数字で尋ねます。

デバイスはそれぞれが自分のID

MacまたはiPhoneでPeeringを初めて実行すると、P-256の鍵ペアを生成し、秘密鍵をそのデバイスのKeychainに保存します。 この鍵が、そのデバイスの恒久的なIDです。ユーザー名もパスワードもなく、コピーを持つサーバーもありません。 アプリを起動するたびに、その鍵で新しい自己署名証明書に署名し、ほかのデバイスは証明書ではなく鍵を固定して使います。

自己署名証明書は、それだけでは何も証明しません。言えるのは「この鍵がこの証明書を作った」ということで、 「これはリビングにあるMacだ」ではありません。鍵と物理的なデバイスを結びつける何かが必要で、その何かはあなた自身です。

6桁の数字

iPhoneとMacが初めて出会うと、両方の画面に6桁のコードが表示されます。一致していることを確認してください。 一致していれば、それぞれのデバイスが相手の鍵を保存します。一致しなければ、誰かが2台の間に入っているので、拒否します。

このコードはランダムではなく、パスワードでもありません。ハンドシェイク全体の短いハッシュです。 両方のデバイスID、双方の新しい使い捨ての鍵、双方の使い捨ての乱数、そしてMacのID鍵が対象です。 具体的には、これらのフィールドに対するSHA-256の先頭4バイトを、6桁の10進数に縮めたものです。 攻撃者が接続を中継すると、MacとiPhoneはそれぞれ異なる記録を見ることになり、したがって異なる数字になります。

MacのPeeringの「最初のiPhoneをペアリングする」画面。3つの接続方法とQRコードが表示されています。
MacはiPhoneを待っています。両者が出会うと、コードが両方の画面に表示されます。

なぜ先にコミットするのか

6桁のコードには100万通りの値しかないので、賢い攻撃者は、両側がたまたま同じ数字を表示するまで、使い捨ての鍵を延々と試すかもしれません。 このプロトコルは、コミットとリビールの手順でその道をふさいでいます。

  1. 各側が最初に、自分の使い捨ての鍵と乱数のハッシュを送ります。
  2. 両方のハッシュが揃って初めて、どちらも本当の値を明かします。
  3. 各側が、明かされた値を、先に受け取ったハッシュと照合します。

攻撃者は何も見ないうちにコミットしなければならないので、値を調整して一致させることができません。 残るのは当てずっぽうで、1回の試行でコードが一致する確率は100万分の1です。失敗した試行は、目に見える不一致として現れます。

QRコードの近道

MacのQRコードをスキャンする場合、目で比べるものはありません。QRには16バイトの秘密が入っていて、 Macの画面を見ている人にしか手に入りません。iPhoneはこれを使って証明(ハンドシェイクに対するHMAC)を計算し、 Macはそれを、ペアリングしている人が実際にMacの目の前にいる証拠として受け入れます。この証明がなければ、 Mac自身のユーザーに承認を求めます。

ペアリングのあとは、鍵の比較になる

以降の接続はすべてTLS 1.3のセッションで、双方が鍵を提示します。iPhoneは、Macの鍵を実際に受け取った証明書から取り出し、 Macがメッセージで伝える内容は使いません。そして保存済みの鍵と、一定時間で比較します。鍵が違えば接続しません。 最初の1回のあとは、あなたに何も求めません。

Macが「あなたのことはすでに知っている」と主張しても、iPhoneにそのMacの保存済みの鍵がなければ、iPhoneは拒否します。 見知らぬ相手でも簡単に言えることなので、その主張は何も証明しません。

実際の手順はペアリングガイドにあります。接続ができたあとに何が起きるかは、 リレーに見えるものをご覧ください。

よくある質問

Peeringにアカウントやメールアドレスは必要ですか?

いいえ。各デバイスが自分の鍵を作り、自分のKeychainに保存します。ペアリングは、両方の画面で見比べる6桁のコードで行います。

6桁のペアリングコードは、何を防ぎますか?

iPhoneとMacの間に入り込む第三者です。コードはハンドシェイク全体から導かれるので、中間者がいると2つの画面で異なるコードになり、不一致が見て分かります。