use strictures; use feature "say"; use Crypt::Eksblowfish::Bcrypt "en_base64", "de_base64", "bcrypt_hash"; my $pass = shift || "passw0rd"; my $php_pass = qx{php -r 'echo password_hash($pass, PASSWORD_BCRYPT);'}; my ( $algorithm, $cost, $salt_pass ) = grep length, split /\$/, $php_pass; my $salt = substr $salt_pass, 0, 22; my $perl_hash = en_base64( bcrypt_hash({ cost => $cost, key_nul => 1, salt => de_base64($salt) }, $pass ) ); my $perl_pass = sprintf '$%s$%d$%s%s', $algorithm, $cost, $salt, $perl_hash; say " PHP $pass -> ", $php_pass; say "Perl $pass -> ", $perl_pass; #### PHP passw0rd -> $2y$10$ThWGjh5Jly8qP6FMQApQ3OQElLLuwN03jlZMFdQngphJw7U5NCukG Perl passw0rd -> $2y$10$ThWGjh5Jly8qP6FMQApQ3OQElLLuwN03jlZMFdQngphJw7U5NCukG