\section{\module{crypt} ---
         Function to check \UNIX{} passwords}

\declaremodule{builtin}{crypt}
  \platform{Unix}
\modulesynopsis{The \cfunction{crypt()} function used to check
  \UNIX{} passwords.}
\moduleauthor{Steven D. Majewski}{sdm7g@virginia.edu}
\sectionauthor{Steven D. Majewski}{sdm7g@virginia.edu}
\sectionauthor{Peter Funk}{pf@artcom-gmbh.de}


This module implements an interface to the
\manpage{crypt}{3}\index{crypt(3)} routine, which is a one-way hash
function based upon a modified DES\indexii{cipher}{DES} algorithm; see
the \UNIX{} man page for further details.  Possible uses include
allowing Python scripts to accept typed passwords from the user, or
attempting to crack \UNIX{} passwords with a dictionary.

\begin{funcdesc}{crypt}{word, salt} 
  \var{word} will usually be a user's password as typed at a prompt or 
  in a graphical interface.  \var{salt} is usually a random
  two-character string which will be used to perturb the DES algorithm
  in one of 4096 ways.  The characters in \var{salt} must be in the
  set \regexp{[./a-zA-Z0-9]}.  Returns the hashed password as a
  string, which will be composed of characters from the same alphabet
   as the salt (the first two characters represent the salt itself).
\end{funcdesc}


A simple example illustrating typical use:

\begin{verbatim}
import crypt, getpass, pwd

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