W3docs

crypt()

La función crypt() realiza hashing unidireccional de una cadena. Aprende su sintaxis, formatos de sal y cómo verificar contraseñas almacenadas.

La función crypt() de PHP realiza hashing unidireccional de una string. "Unidireccional" significa que puedes convertir una contraseña en un hash, pero no puedes recuperar la contraseña original a partir del hash — que es exactamente lo que necesitas para almacenar contraseñas. Esta página cubre la sintaxis, los formatos de sal que seleccionan cada algoritmo de hashing, cómo verificar un hash almacenado y por qué el código moderno debería preferir password_hash().

Sintaxis

crypt(string $string, string $salt = ""): string

La función acepta dos parámetros:

  • $string — el texto de entrada que deseas convertir en hash.
  • $salt — una string que selecciona el algoritmo de hashing y aporta bytes aleatorios que hacen que contraseñas idénticas produzcan hashes distintos. La sal es opcional, pero omitirla es inseguro (se genera una advertencia desde PHP 8.0): siempre pasa una sal explícita.

El valor de retorno es la string hasheada. Los primeros caracteres del resultado codifican la sal y el algoritmo, por lo que el hash es autodescriptivo — puedes almacenarlo tal cual y crypt() sabrá más adelante cómo reproducirlo.

Un ejemplo básico

php— editable, runs on the server

Aquí pasamos una string y una sal a crypt(), y devuelve el hash. Con la sal "ab", la salida es el hash DES estándar:

abJnggxhB/yWI

Observa que los dos primeros caracteres de la salida (ab) son la propia sal — así es como crypt() recuerda qué algoritmo y sal produjeron el hash.

Formatos de sal y algoritmos

La forma de la sal le indica a crypt() qué algoritmo usar. Este es el aspecto más importante que debes entender sobre la función:

Prefijo de salAlgoritmoNotas
(2 caracteres, sin $)DESHeredado, débil — solo importan los primeros 8 caracteres de la contraseña. Evítalo.
$1$MD5Antiguo; no usar para contraseñas nuevas.
$5$SHA-256
$6$SHA-512Fuerte; admite un costo rounds=.
$2y$Blowfish (bcrypt)El algoritmo recomendado para crypt(). Formato: $2y$<cost>$<22-char salt>.

Un ejemplo de bcrypt con un costo explícito de 10:

<?php
$hash = crypt("password123", '$2y$10$usesomesillystringforsalt$');
echo $hash;
?>

La salida comienza con $2y$10$, registrando el algoritmo y el costo para que el hash pueda verificarse más tarde:

$2y$10$usesomesillystringforeSNzFqnuq1h/v0NITsGcb4b3qwzSfNIa

Verificar una contraseña

Para comprobar una contraseña contra un hash almacenado, hashea el candidato usando el hash almacenado como sal. crypt() extrae el algoritmo y la sal de ese hash, por lo que reproduce los mismos parámetros automáticamente:

php— editable, runs on the server

Salida:

Password is valid!

Usa hash_equals() en lugar de == para la comparación — se ejecuta en tiempo constante y evita ataques de temporización que pueden filtrar información sobre el hash.

Cuándo usarlo (y qué usar en su lugar)

crypt() es una herramienta de bajo nivel y heredada. Es fácil hacer un uso incorrecto de ella: una sal demasiado corta, el prefijo incorrecto o el obsoleto formato DES producen hashes débiles. Para código nuevo, prefiere los ayudantes de nivel superior que envuelven crypt() y se encargan de la generación de la sal y la selección del algoritmo por ti:

<?php
$hash = password_hash("password123", PASSWORD_DEFAULT);   // generates a strong bcrypt hash + random salt

if (password_verify("password123", $hash)) {
    echo "Password is valid!";
}
?>

password_hash() y password_verify() son la forma recomendada de almacenar y verificar contraseñas en PHP moderno. Recurre a crypt() solo cuando debas interoperar con un sistema existente que ya almacena hashes en formato crypt().

Para hashing simple sin contraseñas (sumas de verificación, claves de caché, ETags), consulta las funciones md5() y sha1() — ten en cuenta que esas no son adecuadas para contraseñas. Para más utilidades de string, consulta la referencia de funciones de string de PHP.

Práctica

Práctica
¿Cuál es el uso principal de la función crypt() en PHP?
¿Cuál es el uso principal de la función crypt() en PHP?
Was this page helpful?