88171.net

既存のテキストをGit管理下に置くスクリプト

ちょっと前に書いた、既存のblosxom用テキスト群からGitリポジトリを作るスクリプト。 git init したワーキングコピーにドバッとテキストを置いて叩くと、各ファイルのmtimeを元にコミット日時を設定して個別にコミットしてくれる。

#!/bin/bash
find . -name \*.txt | sort | while read file; do
    time="`stat --format=%Y $file` +0900"
    git add $file
    env GIT_AUTHOR_DATE="$time" GIT_COMMITTER_DATE="$time" \
        git commit -m 'initial revision' $file
done

まぁ、これを書いたきっかけは「テキストをGit管理できたらナウいんじゃね?」という単なる思いつきで、生の .gitを直接データとして見にいくblosxomプラグインもちょっと書いてはみたんだけど、

とか考え始めたらいろいろめんどくさくなったので、きっとこのままお蔵入りだろうな。

Lepy (Lepai) LP-V3S

というわけでFOSTEXのAP05を通販で買おうと思ったんだけど、調べてたらLepaiという中華メーカーがアレゲな小型アンプを出してるのを知り、気がついたらLP-V3SをAmazonでポチってた。巷での評判はピンキリだけど、まぁハズレでもいいやくらいのノリで。だって、ついでに一緒にポチったCDよりも安いし。

我が家のオーディオ一式

スピーカーは親父から15年くらい前にもらったDIATONE DS-107V。引っ越しの時にそのまま段ボール箱に放り込んだりしても全然へっちゃらなタフなやつ。初代(?)J Soul Brothersの1stシングルのオマケだったステッカーがすっかりくすんでる。ついでにタブレットは、これまた親父からもらったAcer ICONIA TAB A500。OSが古くてもう正直使い物にならないので、いまや完全に音楽再生専用。もらいもんだらけ。

昔はこのスピーカーを鳴らすために、1000円くらいのやっすいアクティブスピーカーの基盤からケーブル引っぱり出してアンプ代わりにしたりしてたなぁ。電気計算とかガン無視で。懐かしい。最近はホームセンターで買ったやっすいスピーカーセットのサブウーファーをアンプ代わりにしてたんだけどこれがまたノイジーで、替えたいなぁと常々思ってた次第。

でLP-V3Sですよ。これがなかなか、上から下までちゃんと鳴る。ノブ回すと少しチリチリするけど、それ以外では全くと言っていいほどノイズが聞こえない。前モデルでは目立ってたという噂のポップノイズもほとんどない。まぁ音源・スピーカー・再生環境から聴く耳まで含めて音質云々を語れるレベルではないので、そのあたりのレビューはその筋のエンスーな皆様に任せます。少なくとも自分的には十分満足できるクオリティ。

ACアダプタは部屋を探したらいくつか出て来たので本体だけ買ったんだけど、古いLCDディスプレイについてた12V/3.4A出力のが普通に使えた。5A出せるのもあるにはあるんだけど、めんどくさいので音質の比較とかはしてない。本体には2Aと表記されてる一方で箱には3Aがベストと書いてあったりするけど、そのへんは謎。

機能面での印象は予想(覚悟?)してたよりも全然良いんだけど、モノとしての作りは正直ひどい。ボリュームノブは偏心してて12時過ぎの位置で下側がこすれてたので、上方向に少しだけ、ジワッと力を掛けたら直った。フレームは歪んでて置くとガタつくので、気が向いたら足をつけようかなぁと思ってるところ。あと御多分に洩れずうちのも入出力チャンネルがひっくり返ってるので、入力側のRCA端子を左右逆に繋いでごまかした。ちなみにミニピンプラグ入力の方は使う予定がないので未チェック。

このいかにも安っぽくて、実際ひどい作りなんだけど、なかなかどうして満足に動くというあたり、一時期ハマってたソビエトカメラに通ずるものがあってとても微笑ましい。で、ソビカメと一緒で使ってるうちにボロが出てきたりもするかもしれないけど、そしたらまた追記するかも。ひとまず第一印象としては、十分使えるやつでした、ということで。

BitTorrent Syncのシークレットキーに関する考察

BitTorrent Syncは、チョー大まかに言うと

  1. デバイス A で、共有したいフォルダ f の シークレットキー を生成する
  2. デバイス B で、 f と同期したいローカルのフォルダ f' と、先ほど生成した シークレットキー を設定する

というたったの2ステップで、デバイス A ・ B の f ・ f' を同期させることができる。 実際使ってみるとチョーお手軽。

で、「この仕組みって本当に安全なの?」という素朴な疑問が生まれる。 だってたった一つの、高々数十Byteの文字列を知ってさえいれば、他人のデータだろうが難なく読み取ることができちゃうわけで。 狙って攻撃できたり、そうでなくてもうっかり衝突しちゃったりとかしないの?

やっぱり皆おっかなびっくりらしく、フォーラムでも疑問の声は上がってたりする。 そうだよねぇ。

で、自分でもちょっと調べてみた。

適当なこと言ってるかもしれないので、デベロッパ向けのドキュメントやユーザガイドも是非読んでみてください。 で、間違いとかあれば指摘していただけると‥‥。

シークレットキーの実際

シークレットキーの長さは仕様上、20 byte (160 bit) もしくはそれ以上と決まってる。 自動生成すると33文字の英数字から成る文字列ができるけど、頭1文字はどうやら便宜上権限を示すらしく、実際のキーは残りの32文字。この文字列、可読性を上げるためにBase32エンコードされたものなので、 32 byte / 8 byte * 40 bit で確かに20 byte (160 bit) ある。

試しに自動生成してみたシークレットキーがこれ。

                           12345678901234567890123456789012
                           +--------+---------+---------+--
シークレットキー          ACGT66NJPIFGVY6YI3GWCWJRYOBOK6XYN
読込専用シークレットキー  BJFMTOC234PX35OZYG4FZP7IMJVJ5KWXM

読込専用 シークレットキーは、シークレットキーからさらに一方向なロジック (じゃなきゃ意味ないし) で自動生成されたもの。 これを知ってるとそのフォルダを読むことだけはできる。

あと ワンタイム シークレットキーというのもあるらしいけど、興味のある人は自分で調べてください。

シークレットキーは門外不出

プロトコル上、シークレットキーが生でネットワーク上を流れることはない。 その代わりに SHA1(Secret):ip:port みたいなシークレットキーのハッシュ値を含んだ情報を各ピアが発信して、P2Pネットワークの中で同じシークレットキーを持ってるピアを探し出してる。

さらにピア同士は、お互いが知っているシークレットキーから生成したAES暗号鍵を使ってデータをやり取りするので、シークレットキーを知らないピアが相手をだまくらかしてデータを盗むことは理論上不可能。

ピア同士のネットワーク構成によっては第三者ピア (リレーサーバ) を経由したりすることもあるらしいけど、基本はやっぱり一緒。

シークレットキーは十分長い

たとえば「地球上のすべての砂粒にIPアドレスを振ってもまだ余る」(大学の講義で某エラい人が言ってた) と評されるIPv6のアドレス空間は128bit。これはつまり、

2^128 =
340282366920938463463374607431768211456 (約340潤) 個

のアドレスが存在し得るということ。

一方でBitTorrent Syncのシークレットキーは前述の通り (最小) 160bit。つまり、

2^160 =
1461501637330902918203684832716283019655932542976 (約1.5極) 個

のシークレットキーが存在し得るということ。ちなみに極 は10^48で、恒河沙の一つ下。ごうがしゃて。

さぁクラックしましょう。 地球上のすべての砂粒の4294967296倍よりもさらに多い砂粒の中からお目当ての一粒を探し出すには、仮に人手をかき集めて一秒に千粒チェックできたとして、果たして何年かかるでしょうか?

2^160 / 1000 / (60 * 60 * 24 * 365) =
46343912903694283301740386628497051612 年

ざっと46澗年かければ見つかりますね。半分くらいでヒットすると期待しても23澗年くらい。 余裕で人類滅ぶ、というか地球が太陽に呑まれてるわ。

次に、仮に全世界で十億個のフォルダが既に共有されているとして、ランダムで自動生成した一個のシークレットキーがうっかり他のフォルダのシークレットキー (読込専用も含む) に一致しちゃう確率は、

2 / 2^160 * 1000000000 =
約 0.0000000000000000000000000000000000001 %

730潤回くらい生成してると、少なくとも一つはヒットしちゃう計算ですね。 730かんかいて。

まとめ

乱数生成器が高品質な乱数を生成していて、BitTorrent Syncの実装にバグがない限り、シークレットキーは十分な計算量的安全性を持ってるはず。 ただし所詮は確率計算上の話なので、世界のどこかで誰かが今頃うっかり俺のシークレットキーの一つを生成しちゃってて、身に覚えもなく落ちてきた大量の写真を見てしきりに首を傾げてるかもしれない。 そして俺は逆に、あまりのラッキーさに感激して失禁しちゃうはず。

まぁマジメな話、シークレットキーはデバイス本体と同じくらい本気で守りましょう。 平文でネットワークに流さないとか、物理的な紛失に注意するとか、そういう基本的なことだけど。 あと、できるだけ小分けしたり読込専用キーを上手く使って、必要なデバイスに必要なキーだけ入れるよう心がけると、万一の際に被害を最小限に抑えられるかと。

「もしや、キーが漏れたかも」と不安に駆られた時は、落ち着いて全部のデバイスのシークレットキーを変更して回りましょう。 少なくとも変更し終わった瞬間からは、再び1.5極の砂粒に潜ることができます。