When you store the user's password on the computer,
concatenate a key and a salt, and encrypt the password with a
cryptographically secure one-way function. Never have programs store
passwords in plaintext form in files or databases. If this file is
compromised, all of the passwords need to be changed!
Traditionally, the easy way to store a password on a Unix system was
to use the Unix crypt(
) library
function with a randomly generated salt. For example, the following
bit of simple Perl code takes a password in the
$password variable, generates a random salt, and
places an encrypted password in the variable
$encrypted_password:
my $salts="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./";
my $s1 = rand(64);
my $s2 = rand(64);
my $salt = substr($salts,$s1,1) . substr($salts,$s2,1);
my $encrypted_password = crypt($password,$salt);
You can then check to see if a newly provided password is in fact the
encrypted password with this simple Perl fragment:
if($encrypted_password eq crypt($entered_password, $encrypted_password) {
print "password matched.\n";
}
This code fragment can be significantly improved by rewriting it to
use the MD5 message digest algorithm:
use Digest::MD5 qw(md5_base64);
my $salts="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./";
my $key ="justakey";
my $s1 = rand(64);
my $s2 = rand(64);
my $salt = substr($salts,$s1,1) . substr($salts,$s2,1);
my $encrypted_password = $salt . md5_base64("$salt/$password/$key");
To verify this password, we would use:
use Digest::MD5 qw(md5_base64);
my $salts= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./";
my $key ="justakey";
my $salt = substr($encrypted_password,0,2);
my $pw2 = $salt . md5_base64("$salt/$entered_password/$key");
if($encrypted_password eq $pw2) {
print "passwords match.\n";
}