#!/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";