176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#!/usr/bin/perl 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanuse bytes; 476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanuse Crypt::PasswdMD5; 576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanuse MIME::Base64; 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmansub random_bytes($) { 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman my($n) = @_; 976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman my($v, $i); 1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ( open(RANDOM, '<', '/dev/random') || 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman open(RANDOM, '<', '/dev/urandom') ) { 1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman read(RANDOM, $v, $n); 1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } else { 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman # No real RNG available... 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman srand($$ ^ time); 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman $v = ''; 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for ( $i = 0 ; $i < $n ; $i++ ) { 1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman $v .= ord(int(rand() * 256)); 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return $v; 2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman($pass, $salt) = @ARGV; 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanunless (defined($salt)) { 3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman $salt = MIME::Base64::encode(random_bytes(6), ''); 3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman $salt =~ tr/\+/./; # . not + 3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanprint unix_md5_crypt($pass, $salt), "\n"; 35