| #!/usr/bin/perl |
| |
| use bytes; |
| use Digest::SHA1; |
| 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), ''); |
| } |
| $pass = Digest::SHA1::sha1_base64($salt, $pass); |
| |
| print '$4$', $salt, '$', $pass, "\$\n"; |