1#!/usr/bin/perl 2 3use bytes; 4use Crypt::PasswdMD5; 5use MIME::Base64; 6 7sub random_bytes($) { 8 my($n) = @_; 9 my($v, $i); 10 11 if ( open(RANDOM, '<', '/dev/random') || 12 open(RANDOM, '<', '/dev/urandom') ) { 13 read(RANDOM, $v, $n); 14 } else { 15 # No real RNG available... 16 srand($$ ^ time); 17 $v = ''; 18 for ( $i = 0 ; $i < $n ; $i++ ) { 19 $v .= ord(int(rand() * 256)); 20 } 21 } 22 23 return $v; 24} 25 26 27($pass, $salt) = @ARGV; 28 29unless (defined($salt)) { 30 $salt = MIME::Base64::encode(random_bytes(6), ''); 31 $salt =~ tr/\+/./; # . not + 32} 33 34print unix_md5_crypt($pass, $salt), "\n"; 35