Perl crypt tutorial shows how to encrypt passwords in Perl using crypt function.
last modified April 4, 2025
The Perl crypt function performs one-way encryption of strings. It’s primarily used for password storage and verification.
crypt uses the system’s native encryption, typically based on DES, MD5, or SHA algorithms. The function requires a plaintext string and a salt value for encryption.
The simplest way to use crypt is with a plaintext and salt.
basic.pl
#!/usr/bin/perl
use strict; use warnings; use v5.34.0;
my $password = “secret123”; my $salt = “ab”;
my $encrypted = crypt($password, $salt); print “Encrypted: $encrypted\n”;
We demonstrate crypt encrypting a password with a simple salt. The salt affects the encryption result and should be random in practice.
$ ./basic.pl Encrypted: abJnggxhB/yWI
crypt is commonly used to verify passwords against stored hashes.
verify.pl
#!/usr/bin/perl
use strict; use warnings; use v5.34.0;
my $stored_hash = ‘abJnggxhB/yWI’; my $input_pass = ‘secret123’;
if (crypt($input_pass, $stored_hash) eq $stored_hash) { print “Password correct\n”; } else { print “Password incorrect\n”; }
This script checks if an input password matches a stored encrypted hash. The stored hash itself serves as the salt for verification.
$ ./verify.pl Password correct
For secure encryption, salts should be randomly generated.
salt.pl
#!/usr/bin/perl
use strict; use warnings; use v5.34.0;
sub generate_salt { my @chars = (’.’, ‘/’, 0..9, ‘A’..‘Z’, ‘a’..‘z’); return join ‘’, @chars[map {rand @chars} 1..8]; }
my $password = “mypassword”; my $salt = generate_salt(); my $hash = crypt($password, $salt);
print “Salt: $salt\n”; print “Hash: $hash\n”;
We create a random 8-character salt from a character set suitable for crypt. The salt is combined with the password to create a unique hash.
$ ./salt.pl Salt: 7dHj9kLm Hash: 7dHj9kLmXJ4h6Y
Modern systems often use MD5 encryption with crypt.
md5.pl
#!/usr/bin/perl
use strict; use warnings; use v5.34.0;
my $password = “securepass”; my $salt = ‘$1$’ . join ‘’, map { (’.’, ‘/’, 0..9, ‘A’..‘Z’, ‘a’..‘z’)[rand 64] } 1..8;
my $hash = crypt($password, $salt); print “MD5 Hash: $hash\n”;
This example generates an MD5 hash by using a salt starting with ‘$1$’. The resulting hash will be longer and more secure than traditional DES.
$ ./md5.pl MD5 Hash: $1$7f8Gj9kL$m4Xp2qR7sT9vYw1z3c5b7
For stronger security, SHA-256 or SHA-512 can be used with crypt.
sha.pl
#!/usr/bin/perl
use strict; use warnings; use v5.34.0;
sub generate_sha_salt { my $type = shift || ‘256’; # 256 or 512 my $prefix = $type eq ‘256’ ? ‘$5$’ : ‘$6$’; return $prefix . join ‘’, map { (’.’, ‘/’, 0..9, ‘A’..‘Z’, ‘a’..‘z’)[rand 64] } 1..16; }
my $password = “supersecret”; my $salt = generate_sha_salt(‘512’); my $hash = crypt($password, $salt);
print “SHA-512 Hash: $hash\n”;
We generate a SHA-512 hash by using a salt starting with ‘$6$’. SHA algorithms provide much stronger security than older methods.
$ ./sha.pl SHA-512 Hash: $6$7f8Gj9kLm4Xp2qR7$sT9vYw1z3c5b7d9e1f3g5h7j9k1l3m5n7p9q1r3s5t
Here’s a complete example of user authentication using crypt.
auth.pl
#!/usr/bin/perl
use strict; use warnings; use v5.34.0;
my %users = ( ‘admin’ => ‘$6$7f8Gj9kL$m4Xp2qR7sT9vYw1z3c5b7d9e1f3g5h’, ‘user1’ => ‘$1$7f8Gj9kL$m4Xp2qR7sT9vYw1z3c5b7’ );
print “Username: “; my $username = <STDIN>; chomp $username;
print “Password: “; my $password = <STDIN>; chomp $password;
if (exists $users{$username} && crypt($password, $users{$username}) eq $users{$username}) { print “Authentication successful\n”; } else { print “Authentication failed\n”; }
This script simulates a user authentication system with stored hashes. It shows proper password verification against pre-computed hashes.
We can combine crypt with password strength verification.
strength.pl
#!/usr/bin/perl
use strict; use warnings; use v5.34.0;
sub check_strength { my $pass = shift; return 0 if length($pass) < 8; return 0 unless $pass =~ /[A-Z]/; return 0 unless $pass =~ /[a-z]/; return 0 unless $pass =~ /[0-9]/; return 0 unless $pass =~ /[^A-Za-z0-9]/; return 1; }
print “Enter new password: “; my $password = <STDIN>; chomp $password;
if (check_strength($password)) { my $salt = ‘$6$’ . join ‘’, map { (’.’, ‘/’, 0..9, ‘A’..‘Z’, ‘a’..‘z’)[rand 64] } 1..16; my $hash = crypt($password, $salt); print “Strong password. Hash: $hash\n”; } else { print “Password doesn’t meet strength requirements\n”; }
This example checks password strength before generating a secure hash. It enforces minimum length and character diversity requirements.
Use strong hashes: Prefer SHA-256 or SHA-512 over DES.
Generate random salts: Never use fixed or predictable salts.
Store properly: Keep only the hashes, never plaintext.
Consider alternatives: For new projects, look at modules like Authen::Passphrase.
This tutorial covered Perl’s crypt function with practical examples demonstrating secure password handling techniques.
My name is Jan Bodnar, and I am a passionate programmer with extensive programming experience. I have been writing programming articles since 2007. To date, I have authored over 1,400 articles and 8 e-books. I possess more than ten years of experience in teaching programming.
List all Perl tutorials.