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