手動で鍵交換を支援する
「パスワードは次のメールでお送りします」をやめるためのツール。
- mandihe の URL から HTML を取得
- 取得した HTML を Google Chrome, Firefox などで開く
- 「自分の公開鍵」(以下、公開鍵A)を得る。
- 以下の作業をパートナーに要求する
a. mandihe の URL から HTML を取得してください。
b. 取得した HTML を Google Chrome, Firefox などで開いてください。
c. 公開鍵Aを「パートナーの公開鍵」欄に貼り付けたうえ「パスワードを生成する」ボタンを押してください。
d. 「自分の公開鍵」の中身と「ダイジェスト」をお送りください(パスワードは送らなでください) - 手元のブラウザの「パートナーの公開鍵」に送ってもらった公開鍵を貼り付け、「パスワードを生成する」ボタンを押す。
- 手元のダイジェストが送っていただいたものと一致することを確認する。
- パートナーのパスワード5個と、手元のパスワード5個は一致している。そしてそれらのパスワードは、通信を傍受している人にも推測できない。
- 自分とパートナーで、公開鍵と秘密鍵を作るための HTML+JavaScript をつくる。
- 公開鍵と秘密鍵を作る。
- 公開鍵を交換する。
- 自分の秘密鍵+もらった公開鍵 で、パスワードと digest を作る。
作った公開鍵と秘密鍵は、ブラウザの localStorage
に保存される。
しかし、 localStorage
に平文で保存するのは危険なので、 AES-CTR
で暗号化する。
暗号化するには鍵が要る。
その鍵を保管する場所として、JavaScript のソースコードを選んだ。
鍵は「自分とパートナーで、公開鍵と秘密鍵を作るための HTML+JavaScript をつくる ための HTML」にアクセスするたびに安全な乱数( crypto.getRandomValues
)で作られる。
鍵の生成と生成された鍵を含む HTML の保存はローカル環境で行われる。通信は行われないので、傍受はできない。
鍵は、 crypto.subtle.generateKey
で作る。アルゴリズムは EDCH
の P-521
。
作った鍵は 前述の通り AES-CTR
で暗号化し、 localStorage
に保管する。
交換する鍵は公開鍵なので、メールでも Twitter でもよい。
crypto.subtle.deriveBits
で 528ビット作る。(以下、共有ビット列と呼ぶ)
共有ビット列 を SHA-256
でハッシュする。
得られたバイト列を 16bitずつ区切る。この先頭 4件 がダイジェスト。
共有ビット列 の先頭に n のバイトを追加した 536bit を SHA-256
でハッシュしてダイジェストを得る。
得たダイジェストを 32bit 区切りにして、先頭4件を得る。
各32bitを5文字の文字列に変換(使う文字はほとんどすべての英字大文字小文字数字)してつなげると 20文字のパスワードになる。