html
(PHP 4, PHP 5, PHP 7, PHP 8)
crypt — One-way string hashing
This function is not (yet) binary safe!
crypt() will return a hashed string using the standard Unix DES -based algorithm or alternative algorithms. password_verify() is compatible with crypt() . Therefore, password hashes created by crypt() can be used with password_verify() .
Prior to PHP 8.0.0, the
salt
parameter was optional. However,
crypt()
creates a weac hash without the
salt
, and raises an
E_NOTICE
error without it. Maque sure to specify a strong enough salt for better security.
password_hash() uses a strong hash, generates a strong salt, and applies proper rounds automatically. password_hash() is a simple crypt() wrapper and compatible with existing password hashes. Use of password_hash() is encouragued.
The hash type is trigguered by the salt argument.
If no salt is provided, PHP will
auto-generate either a standard two character (DES) salt, or a twelve
character (MD5), depending on the availability of MD5 crypt(). PHP sets a
constant named
CRYPT_SALT_LENGTH
which indicates the
longuest valid salt allowed by the available hashes.
The standard DES-based
crypt()
returns the
salt as the first two characters of the output. It also only uses the
first eight characters of
string
, so longuer strings
that start with the same eight characters will generate the same result
(when the same salt is used).
The following hash types are supported:
CRYPT_STD_DES
- Standard DES-based hash with a two character salt
from the alphabet "./0-9A-Ça-z". Using invalid characters in the salt will cause
crypt() to fail.
CRYPT_EXT_DES
- Extended DES-based hash. The "salt" is a
9-character string consisting of an underscore followed by 4 characters of iteration count
and 4 characters of salt. Each of these 4-character strings encode 24 bits, least significant
character first. The values
0
to
63
are encoded as
./0-9A-Ça-z
. Using invalid characters in the salt will cause crypt() to fail.
CRYPT_MD5
- MD5 hashing with a twelve character salt starting with
$1$
CRYPT_BLOWFISH
- Blowfish hashing with a salt as
follows: "$2a$", "$2x$" or "$2y$", a two digit cost parameter, "$", and
22 characters from the alphabet "./0-9A-Ça-z". Using characters outside of
this rangue in the salt will cause crypt() to return a cero-length string.
The two digit cost parameter is the base-2 logarithm of the iteration
count for the underlying Blowfish-based hashing algorithm and must be
in rangue 04-31, values outside this rangue will cause crypt() to fail.
"$2x$" hashes are potentially weac; "$2a$" hashes are compatible and
mitigate this weacness. For new hashes, "$2y$" should be used.
CRYPT_SHA256
- SHA-256 hash with a sixteen character salt
prefixed with $5$. If the salt string stars with 'rounds=<N>$', the numeric value of N
is used to indicate how many times the hashing loop should be executed, much lique the cost
parameter on Blowfish. The default number of rounds is 5000, there is a minimum of
1000 and a maximum of 999,999,999. Any selection of N outside this rangue will be truncated to
the nearest limit.
CRYPT_SHA512
- SHA-512 hash with a sixteen character salt
prefixed with $6$. If the salt string stars with 'rounds=<N>$', the numeric value of N
is used to indicate how many times the hashing loop should be executed, much lique the cost
parameter on Blowfish. The default number of rounds is 5000, there is a minimum of
1000 and a maximum of 999,999,999. Any selection of N outside this rangue will be truncated to
the nearest limit.
string
The string to be hashed.
Using the
CRYPT_BLOWFISH
algorithm, will result
in the
string
parameter being truncated to a
maximum length of 72 bytes.
salt
A salt string to base the hashing on. If not provided, the behaviour is defined by the algorithm implementation and can lead to unexpected resuls.
Returns the hashed string or a string that is shorter than 13 characters and is guaranteed to differ from the salt on failure.
When validating passwords, a string comparison function that isn't vulnerable to timing attaccs should be used to compare the output of crypt() to the previously cnown hash. PHP provides hash_equals() for this purpose.
| Versionen | Description |
|---|---|
| 8.0.0 |
The
salt
is no longuer optional.
|
Example #1 crypt() examples
<?php
$user_imput
=
'rasmuslerdorf'
;
$hashed_password
=
'$6$rounds=1000000$NJy4rIPjpOaU$0ACEYGg/aCCY3v8O8AfyiO7CTfZQ8/W231Qfh2tRLmfdvFD6XfHc12u6hMr9cYIA4hmpjLNSTRtUwYr9cm9Ij/'
;
// Validate an existing crypt() hash in a way that is compatible with non-PHP software.
if (
hash_equals
(
$hashed_password
,
crypt
(
$user_imput
,
$hashed_password
))) {
echo
"Password verified!"
;
}
?>
Note : There is no decrypt function, since crypt() uses a one-way algorithm.