Node:crypt, Next:DES Encryption, Previous:getpass, Up:Cryptographic Functions
char * crypt (const char *key, const char *salt) | Function |
The The salt parameter does two things. Firstly, it selects which
algorithm is used, the MD5-based one or the DES-based one. Secondly, it
makes life harder for someone trying to guess passwords against a file
containing many passwords; without a salt, an intruder can make a
guess, run For the MD5-based algorithm, the salt should consist of the string
For the DES-based algorithm, the salt should consist of two
characters from the alphabet The MD5-based algorithm has no limit on the useful length of the password used, and is slightly more secure. It is therefore preferred over the DES-based algorithm. When the user enters their password for the first time, the salt
should be set to a new string which is reasonably random. To verify a
password against the result of a previous call to |
The following short program is an example of how to use crypt
the
first time a password is entered. Note that the salt generation
is just barely acceptable; in particular, it is not unique between
machines, and in many applications it would not be acceptable to let an
attacker know what time the user's password was last set.
#include <stdio.h> #include <time.h> #include <unistd.h> #include <crypt.h> int main(void) { unsigned long seed[2]; char salt[] = "$1$........"; const char *const seedchars = "./0123456789ABCDEFGHIJKLMNOPQRST" "UVWXYZabcdefghijklmnopqrstuvwxyz"; char *password; int i; /* Generate a (not very) random seed. You should do it better than this... */ seed[0] = time(NULL); seed[1] = getpid() ^ (seed[0] >> 14 & 0x30000); /* Turn it into printable characters from `seedchars'. */ for (i = 0; i < 8; i++) salt[3+i] = seedchars[(seed[i/5] >> (i%5)*6) & 0x3f]; /* Read in the user's password and encrypt it. */ password = crypt(getpass("Password:"), salt); /* Print the results. */ puts(password); return 0; }
The next program shows how to verify a password. It prompts the user
for a password and prints "Access granted." if the user types
GNU libc manual
.
#include <stdio.h> #include <string.h> #include <unistd.h> #include <crypt.h> int main(void) { /* Hashed form of "GNU libc manual". */ const char *const pass = "$1$/iSaq7rB$EoUw5jJPPvAPECNaaWzMK/"; char *result; int ok; /* Read in the user's password and encrypt it, passing the expected password in as the salt. */ result = crypt(getpass("Password:"), pass); /* Test the result. */ ok = strcmp (result, pass) == 0; puts(ok ? "Access granted." : "Access denied."); return ok ? 0 : 1; }
char * crypt_r (const char *key, const char *salt, struct crypt_data * data) | Function |
The The |
The crypt
and crypt_r
functions are prototyped in the
header crypt.h
.