http://qs321.pair.com?node_id=6136

   1: Good for creating passwords for .htpasswd files or for any other *nix password file:
   2: 
   3: <CODE>
   4: sub mkpasswd{
   5:   my($plaintextpass)=@_;
   6:   my($salt1, $salt, $encrypted);
   7: 
   8:   $salt1 = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./'; 
   9:   $salt = substr($salt1,rand(length($salt1)),1);
  10:   $salt .= substr($salt1,rand(length($salt1)),1);
  11:   $encrypted = crypt($plaintextpass, $salt);
  12: 
  13:   return $encrypted;
  14: }
  15: </CODE>

Replies are listed 'Best First'.
RE: Create encrypted passwords
by Anonymous Monk on Mar 27, 2000 at 13:52 UTC
    Line 9 assigns a character to $salt, so when $salt is used in line 10, it will pick a random character from the 1 character $salt, which means $salt will always be two repeated characters.
RE: Create encrypted passwords
by IndyZ (Friar) on Apr 19, 2000 at 06:46 UTC
    From a crypto point of view, it is <BLINK>very</BLINK> important to remember that on many systems, the rand function may not be truly random.
    You have been warned.

    Brian
RE: Create encrypted passwords
by Anonymous Monk on Mar 28, 2000 at 08:08 UTC
    Better so: @chars=(a..z,A..Z,0..9,'.','/'); $salt=$charsrand(64).$charsrand(64); Zak

      Better still:

      $salt = join '', ('a'..'z','A'..'Z',0..9,'.','/')[rand 64, rand 64] ;

      -Ducky

      Update: Ok, took me a year to come back and fix this, but it's fixed the way I'd do it today. =/

        That doesn't work. You're taking an array slice (incorrectly), then assigning it to a scalar variable. You want something like this:
        my @chars = ('a'..'z', 'A'..'Z', 0..9, '.', '/'); my $salt = join '', @chars[rand @chars, rand @chars];
        Note the "@" before "chars"--that denotes an array slice. And since we're taking an array slice and want to end up with a scalar, we need to do a join.
        What if you want to expand the valid characters someday?
        @chars=(a..z,A..Z,0..9,'.','/'); $salt= join '', @chars[rand(@chars), rand(@chars)];
        or even
        my $elem = @chars; $salt = join '', @chars[rand($elem), rand($elem)];
      Try again *sigh*...
      . . . @chars=(A..Z,a..z,0..9,'.','/'); $salt=$chars[rand(64)].$chars[rand(64)]; . . .

      Zak