| #!/usr/bin/perl |
| |
| use bytes; |
| use Crypt::PasswdMD5; |
| use MIME::Base64; |
| |
| sub random_bytes($) { |
| my($n) = @_; |
| my($v, $i); |
| |
| if ( open(RANDOM, '<', '/dev/random') || |
| open(RANDOM, '<', '/dev/urandom') ) { |
| read(RANDOM, $v, $n); |
| } else { |
| # No real RNG available... |
| srand($$ ^ time); |
| $v = ''; |
| for ( $i = 0 ; $i < $n ; $i++ ) { |
| $v .= ord(int(rand() * 256)); |
| } |
| } |
| |
| return $v; |
| } |
| |
| |
| ($pass, $salt) = @ARGV; |
| |
| unless (defined($salt)) { |
| $salt = MIME::Base64::encode(random_bytes(6), ''); |
| $salt =~ tr/\+/./; # . not + |
| } |
| |
| print unix_md5_crypt($pass, $salt), "\n"; |