パスワードを伝える

[戻る]

昔管理していたサーバの管理者パスワードなどを 誰かに伝えないといけないときがあります. 一番安全な方法は, 電話で相手を捕まえ口頭で伝えることだと思います. とはいえ電話ってのはめんどうですので, 社内 LAN に守られてて, かつたいした仕事をしてないマシンだと メールで済ませたいものです. とは言え, パスワードをそのまま送るのは抵抗があります. お互いの共通知識 (別のサーバのパスワードとか, 共通の知人の下の名とか) をキーワードに多少でも 暗号化しておきたいものです.

以前私が使っていたのは, 以下のようなスクリプトを使うことでした. サーバのパスワードを欲するくらいの人であれば perl が動く環境くらい 持っているでしょう.

use Crypt::RC4;
use MIME::Base64;

$key  = 'common word';       # 共通知識
$text = 'sending phrase';    # 伝えたいパスワード

$encrypted=encode_base64(RC4($key, $text));
print "encrypt = $encrypted\n";

そして, 相手には以下のような文字列をメールに沿え, 「共通知識部分を書き換えて走らせろ」と伝えてました.

use Crypt::RC4;
use MIME::Base64;

$key  = 'common word';  # 共通知識

$encrypted="rZiUoSyO1zqZjbRSimI=";  # ← 上記スクリプトで出力された文字列

$decrypted=RC4($key, decode_base64($encrypted));
print "decrypt = \"$decrypted\"\n";

問題なのは, 標準の perl には Crypt::RC4 が入ってないので, 相手に RC4.pmを入手してもらう必要があることです. ただ, 別にインストールの手間はなく, スクリプトを置いたディレクトリに Crypt というディレクトリを置き, その下に RC4.pm を置くだけで動く手軽さがあります (Crypt::CBC+Rijndael を使うと強度は上がると思いますが, インストール操作: make が必要になり相手の負担が大きくなります).

一方, 相手が Linux とか cygwin を使っているのが確実であれば OpenSSL を使う手もあります ( Windows 版 もあるらしいが, インストールがめんどそう). 暗号化は

# echo sending phrase | openssl enc -a -e -aes128
複合化は
# echo U2FsdGVkX19PBRtQPhE6TSHltRdg5UqcvzHsW8lf3S8= | openssl enc -a -d -aes128
てな感じでできます.

大体はこんな感じで済むのですが, 相手が perl も OpenSSL も持ってない, 何かインストールするのも嫌っという場合困ります. パスワード欲しがるくせにそんなスキルも心意気も無い奴はほっとくというのが 正論でしょうが, えてしてそんな奴は己の要求が満たされるまでこちらに迷惑かけまくりなので, 多少は折れてやることも自分の為です.

とにかく, 殆ど素の Windows で複合できなくてはなりません. 自己複合機能付きの exe を渡すという手もありますが, exe はメールで通り難かったり, 相手が嫌がる恐れがあります (私だって嫌です).

暗号化 zip とかいろいろ考えた結果思いついたのが, JavaScript です. 一見ブラウザですし, 許してもらえるかもしれません (最も, ブラウザなので実際は PC 内で計算は閉じているのに, 通信でどこかにパスワードを送ってるかもっと思われるかもしれませんが...)

それがこれです (右クリックメニューで保存してください). 上記の OpenSSL で暗号化した文字列を複合することができます (ただし, 「パスワードの伝達」を意識したため, あまり長い文字列は復号しません). なんかすごそうなスクリプトですけど, 実は こことか, ここ とかここから 関数抜き取って張り合わせただけです. 正直言うと JavaScript 書いたのは今回が初めてです (96〜7 年頃かな, JavaScript が書かれたページが流行りだした時, 遅くてあまりいい印象が持てず, それ以来無視してました).

そうそう, 他に暗号化した pdf を送るという手もありますね. いくらなんでも Acrobat Reader くらいは入れてるでしょう.


2008.5