Perl 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.
Basic crypt Usage
The simplest way to use crypt
is with a plaintext and salt.
#!/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
Password Verification
crypt
is commonly used to verify passwords against stored hashes.
#!/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
Generating Random Salts
For secure encryption, salts should be randomly generated.
#!/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
MD5 Encryption
Modern systems often use MD5 encryption with crypt.
#!/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
SHA-256/512 Encryption
For stronger security, SHA-256 or SHA-512 can be used with crypt.
#!/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
User Authentication System
Here's a complete example of user authentication using crypt.
#!/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.
Password Strength Checker
We can combine crypt with password strength verification.
#!/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.
Best Practices
- 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.
Source
This tutorial covered Perl's crypt
function with practical
examples demonstrating secure password handling techniques.
Author
List all Perl tutorials.