<!-- $Id: crypt.sgml,v 1.7 1997-05-08 18:31:38 max Exp $ -->
<!-- The FreeBSD Japanese Documentation Project -->
<!-- Original revision: 1.4 -->

<sect><heading>DES, MD5, と Crypt<label id="crypt"></heading>

<p><em>原作: &a.wollman;<newline>24 September 1995.</em>

<p><em>訳: &a.hanai;<newline>12 September 1996.</em>

<p>UN*X システムにおいてパスワードを保護し, 簡単に覗かれるのを防
ぐために, 従来パスワードはある方法によりスクランブルされてきました.
ベル研の Unix 第7版に始まって以来, パスワードはセキュリティの専門家がい
うところの「一方向ハッシュ関数」というものを用いることにより暗号化されるようになりました.
つまり, 可能な限りのパスワード空間を検索するという強引な
方法以外にそのオリジナルを得ることができない, といった方法でパスワードは変換
されるのです. 不幸なことに, その当時 AT&amp;T の研究者たちが手に入れることができ
た唯一の暗号化方法は DES(Data Encryption Standard) に基づいたものでし
た. これは営利企業にとっては大して問題ではありませんが, FreeBSDのよ
うにすべてのソースコードが自由に手に入るオペレーティングシステムにとっ
ては重大な問題となります. なぜなら, 多くの政府は DES やその他の暗号化ソフ
トウェアが国境を越えることに制限をつけようとしているからです.

<p>ここで, FreeBSD チームは一つのジレンマに直面しました. つまり, どうす
れば法に触れることなく国外にあるそれらの UNIX システムのすべてに互換性を持
たせることができるか, ということです. 私たちは ``dual track approach'' を
取ることに決めました. 規制されていないパスワードスクランブラのみを含む
配布用物件を作り, DES に基づいたパスワードハッシュを付加ライブラリ
として分けて供給するのです. パスワードをスクランブルさせる関数は, C ライブラリから
`<tt>libcrypt</tt>' と呼ばれる(それを実行する C 関数が `<tt>crypt</tt>' と
いう名前だからです)別のライブラリへ移されました. FreeBSD 1.x 及び
2.0 のリリース前のスナップショットでは, その規制されていないスクランブラは
Nate Williams によって書かれた安全でない関数を使っていますが, 次の
リリースでは RSA Data Security 社の一方向ハッシュ関数の MD5 を使う方法
に置き換えられました. これらの関数はどれも暗号化を含んでいないため,
合衆国から持ち出し, 他の多くの国へ持ち込めるものであるとされています.

<p>一方, DES に基づいたパスワードハッシュ関数に関する作業もまた進行中
でした, まず, 合衆国及び他の国で書かれたコードの同期をとりながら,
合衆国の外で書かれた `<tt>crypt</tt>' のあるバージョンが持ち込まれました.
そしてライブラリは修正され, 二つにわけられました. すなわち
DES `<tt>libcrypt</tt>' は一方向パスワードハッシュをおこなうのに必要なコード
のみを含み, それとは別の `<tt>libcipher</tt>' は実際に暗号化をおこなう
ためのエントリポイントとして生成されました. コンパイルされたライブラリに対
して国外に持ち出す許可を得るのを簡単にするために, コードはこのように分け
られたのです.

<sect1><heading>`<tt>crypt</tt>' メカニズムを理解する</heading>

<p>あるパスワード文字列を作るのに, DES に基づいたハッシュ関数を使っ
たのか, MD5に基づいたハッシュ関数を使ったのかは非常に簡単にわかります.
MD5 を使ったパスワード文字列は必ず `<tt>&dollar;1&dollar;</tt>' という文字
で始まります. DESを使ったパスワード文字列はどんな特定の文字も持っていま
せんが, MD5を使ったパスワードよりも短く, `<tt>&dollar;</tt>' という文字
を持たない64文字のアルファベットで構成されています. したがって, ドル記号で
始まっていない比較的短い文字列は DES を使ったパスワードである可能性が非常
に高いです.

<p>あなたのシステムで, どちらのライブラリが使われているかを決めるの
は, スタティックにリンクされている `<tt>init</tt>' のようなもの(その
ようなプログラムに対する唯一の方法はわかっているパスワードを試してみ
て動くかどうかを確認することです.)を除いたほとんどのプログラムについ
ては非常に簡単なことです. `<tt>crypt</tt>' を使うようなプログラムは
`<tt>libcrypt</tt>' にリンクされています. そしてそれぞれのライブラリに
対する `<tt>libcrypt</tt>' は適切な実装へのシンボリックリンクとなってい
ます. 例えば, DES 版を使っているようなシステムにおいては次のようになって
います:

<tscreen><verb>
$ cd /usr/lib
$ ls -l /usr/lib/libcrypt*
lrwxr-xr-x  1 bin  bin  13 Sep  5 12:50 libcrypt.a -> libdescrypt.a
lrwxr-xr-x  1 bin  bin  18 Sep  5 12:50 libcrypt.so.2.0 -> libdescrypt.so.2.0
lrwxr-xr-x  1 bin  bin  15 Sep  5 12:50 libcrypt_p.a -> libdescrypt_p.a
</verb></tscreen>

MD5 に基づいたライブラリを使っているシステムにおいては, 同じようなリンクが
見られるでしょうが, そのターゲットは `<tt>libdescrypt</tt>' ではなく
`<tt>libscrypt</tt>' になっているでしょう.
