>Perhaps you need to rewrite mkSalt() so it supports MD5 salts as well, if
>that's what your system's crypt() expects (?).

Talking of which, I've managed to find a subroutine I wrote that does
exactly this...

#----------------------------------------------------------------------------
# generate_salt()
#   generates a random "salt" for use with crypt(3), which Perl's crypt() 
#   is based on.
#
# Notes
#   The DES based algorithm uses a salt of 2 characters drawn from the range 
#   [a-zA-Z0-9./]. MD5 uses a variable length salt: '$1$' (the signature 
#   that tells crypt(3) the caller wants MD5 encryption rather than DES) 
#   followed by 0-8 characters of the same range as the DES salt, followed 
#   optionally by '$'.
#
#     /\A[a-zA-Z0-9.\/]{2}\z/                   // regex for DES salt
#     /\A\$1\$[a-zA-Z0-9.\/]{0,8}\$?\z/         // regex for MD5 salt
#
# Returns
#   a "salt" string appropriate for crypt(3) - may be DES or MD5 salt
#----------------------------------------------------------------------------
sub generate_salt {
  my $algo       = choose_crypt_algo($PREFERRED_CRYPT_ALGO);
  my @salt_chars = ('a'..'z', 'A'..'Z', 0..9, '.', '/');
  my ($salt, $salt_length);

  srand;                        ### set random number seed for CORE::rand
  if ( $algo & $DES_CRYPT ) {   ### chosen crypt algorithm is DES
    $salt        = '';
    $salt_length = 2;
  }
  else {                        ### chosen crypt algorithm is MD5
    $salt        = '$1$';       # MD5 salt prefix
    $salt_length = int rand 9;  # random integer from 0 to 8 inclusive
  }
  
  while ($salt_length--) {      ### randomly generate the salt
    my $idx = int rand @salt_chars;
    $salt  .= $salt_chars[$idx];
  }
  return $salt;
}

hth,
Mark

-- 
Report problems: http://perl.apache.org/bugs/
Mail list info: http://perl.apache.org/maillist/modperl.html
List etiquette: http://perl.apache.org/maillist/email-etiquette.html

Reply via email to