Funciones de strings
PHP Manual

crypt

(PHP 4, PHP 5)

cryptHashing de una sola vía de un string

Descripción

string crypt ( string $str [, string $salt ] )

El parámetro salt es opcional. Sin embargo, crypt() crea contraseñas débiles sin salt. PHP 5.6 o posterior emite un error de nivel E_NOTICE sin él. Asegúrese de especificar una sal suficientemente fuerte para una mejor seguridad.

password_hash() utiliza un hash fuerte, genera una sal fuerte, aplica los redondeos necesarios automáticamente. password_hash() es una envoltura simple de crypt() y es compatible con los hash de contraseñas existentes. Se aconseja el uso de password_hash().

crypt() devolverá el hash de un string utilizando el algoritmo basado en DES estándar de Unix o algoritmos alternativos que puedan estar disponibles en el sistema.

Algunos sistemas operativos soportan más de un tipo de hash. De hecho, a veces el algoritmo estándar DES es sustituído por un algoritmo basado en MD5. El tipo de hash se dispara mediante el argumento salt. Antes de 5.3, PHP determinaría los algoritmos disponibles en el momento de la instalación, basado en el crypt() del sistema. Si no se proporciona salt, PHP intentará auto-generar ya sea un salt estándar de dos caracteres (DES) o uno de doce caracteres (MD5), dependiendo de la disponibilidad del crypt() de MD5. PHP establece una constante llamada CRYPT_SALT_LENGTH la cual indica la mayor longitud válida de salt permitida por los hash disponibles.

El crypt() estándar basado en DES devuelve el salt como los primeros dos caracteres de la salida. También utiliza solamente los primeros ocho caracteres de str, así que strings más largos que inicien con los mismos ocho caracteres, generarán el mismo resultado (cuando se utiliza el mismo salt).

En sistemas donde la función crypt() soporta múltiples tipos de hash, las siguientes contantes se establecen en 0 ó 1 dependiendo de que si el tipo dado está disponible:

Nota:

A partir de PHP 5.3.0, PHP contiene su propia implementación y la utilizará si el sistema carece de soporte para uno o varios de los algoritmos.

Parámetros

str

El string para hacerle el hash.

Precaución

El uso del algoritmo CRYPT_BLOWFISH resultará en que el parámetro str sea truncado a una longitud máxima de 72 caracteres. Esto solamente es preocupante si se usa la misma sal para aplicar el hash a los strings con este algoritmo que tienen más de 72 bytes de longitud, ya que resultará en que dichos hash sean idénticos.

salt

Un string opcional de salt para la base del hash. Si no se proporciona, el comportamiento se define por la aplicación del algoritmo y puede conducir a resultados inesperados.

Valores devueltos

Devuelve un string con el hash o un string que es más corto que 13 caracteres y que se garantiza que difiere del salt en caso de fallo.

Historial de cambios

Versión Descripción
5.6.0 Se emite una advertencia de seguridad E_NOTICE si se omite salt.
5.3.7 Se añadieron los modos de Blowfish $2x$ y $2y$ para tratar con ataques de bit alto potenciales.
5.3.2 Agregado el crypt SHA-256 y SHA-512 basado en la » implementación de Ulrich Drepper.
5.3.2 Corregido el comportamiento de Blowfish sobre rondas no válidas para devolver el string "failure" ("*0" or "*1"), en lugar de caer al DES.
5.3.0 PHP ahora contiene su propia implementación de los algoritmos MD5, DES estándar, DES extendido y Blowfish y los utilizará si el sistema carece de soporte para uno o varios de los algoritmos.

Ejemplos

Ejemplo #1 crypt() examples

<?php
$hashed_password 
crypt('mypassword'); // dejar que el salt se genera automáticamente

/* Se deben pasar todos los resultados de crypt() como el salt para la comparación de una
   contraseña, para evitar problemas cuando diferentes algoritmos hash son utilizados. (Como
   se dice arriba, el hash estándar basado en DES utiliza un salt de 2 
   caracteres, pero el hash basado en MD5 utiliza 12.) */
if (crypt($user_input$hashed_password) == $hashed_password) {
   echo 
"¡Contraseña verificada!";
}
?>

Ejemplo #2 Using crypt() with htpasswd

<?php
// Establece la contraseña
$password 'mypassword';

// Obtiene el hash, dejando que el salt sea generado be automáticamente
$hash crypt($password);
?>

Ejemplo #3 Using crypt() with different hash types

<?php
/* Estas sales son solamente ejemplos, y no deberían usarse textualmente en su código.
   Debería generar una sal distinta correctamente formada para cada contraseña.
*/
if (CRYPT_STD_DES == 1) {
    echo 
'Standard DES: ' crypt('rasmuslerdorf''rl') . "\n";
}

if (
CRYPT_EXT_DES == 1) {
    echo 
'Extended DES: ' crypt('rasmuslerdorf''_J9..rasm') . "\n";
}

if (
CRYPT_MD5 == 1) {
    echo 
'MD5:          ' crypt('rasmuslerdorf''$1$rasmusle$') . "\n";
}

if (
CRYPT_BLOWFISH == 1) {
    echo 
'Blowfish:     ' crypt('rasmuslerdorf''$2a$07$usesomesillystringforsalt$') . "\n";
}

if (
CRYPT_SHA256 == 1) {
    echo 
'SHA-256:      ' crypt('rasmuslerdorf''$5$rounds=5000$usesomesillystringforsalt$') . "\n";
}

if (
CRYPT_SHA512 == 1) {
    echo 
'SHA-512:      ' crypt('rasmuslerdorf''$6$rounds=5000$usesomesillystringforsalt$') . "\n";
}
?>

El resultado del ejemplo sería algo similar a:

Standard DES: rl.3StKT.4T8M
Extended DES: _J9..rasmBYk8r9AiWNc
MD5:          $1$rasmusle$rISCgZzpwk3UhDidwXvin0
Blowfish:     $2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi
SHA-256:      $5$rounds=5000$usesomesillystri$KqJWpanXZHKq2BOB43TSaYhEWsQ1Lr5QNyPCDH/Tp.6
SHA-512:      $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21

Notas

Nota: No hay función de descifrado, ya que crypt() utiliza un algoritmo de un solo sentido.

Ver también


Funciones de strings
PHP Manual