36.5. "crypt" --- Unix パスワードをチェックするための関数
*********************************************************

このモジュールは修正 DES アルゴリズムに基づいた一方向ハッシュ関数であ
る *crypt(3)*  ルーチンを実装しています。詳細については Unix マニュア
ルページを参照してください。このモジュールは、Python スクリプトがユー
ザから入力されたパスワードを受理できるようにしたり、Unix パスワードに
(脆弱性検査のための) 辞書攻撃を試みるのに使えます。

このモジュールは実行環境の *crypt(3)* の実装に依存しています。そのため
、現在の実装で利用可能な拡張を、このモジュールでもそのまま利用できます
。

crypt.crypt(word, salt)

   *word* は通常はユーザのパスワードで、プロンプトやグラフィカルインタ
   フェースからタイプ入力されます。 *salt* は通常ランダムな 2 文字から
   なる文字列で、DES アルゴリズムに 4096 通りのうち 1 つの方法で外乱を
   与えるために使われます。 *salt* に使う文字は集合 "[./a-zA-Z0-9]" の
   要素でなければなりません。ハッシュされたパスワードを文字列として返
   します。パスワード文字列は *salt* と同じ文字集合に含まれる文字から
   なります (最初の 2 文字は *salt* 自体です).

   いくつかの拡張された *crypt(3)* は異なる値と *salt* の長さを許して
   いるので、パスワードをチェックする際には crypt されたパスワード文字
   列全体を *salt* として渡すよう勧めます。

典型的な使用例のサンプルコード:

   import crypt, getpass, pwd

   def login():
       username = raw_input('Python login:')
       cryptedpasswd = pwd.getpwnam(username)[1]
       if cryptedpasswd:
           if cryptedpasswd == 'x' or cryptedpasswd == '*':
               raise NotImplementedError(
                   "Sorry, currently no support for shadow passwords")
           cleartext = getpass.getpass()
           return crypt.crypt(cleartext, cryptedpasswd) == cryptedpasswd
       else:
           return 1
