Función crypt() de PHP
Definición y uso
La función crypt() devuelve una cadena encriptada utilizando el algoritmo DES, Blowfish o MD5.
El comportamiento de la función en diferentes sistemas operativos es diferente, ciertos sistemas operativos admiten un tipo de algoritmo más de uno. Durante la instalación, PHP verifica qué algoritmos están disponibles y cuál se utiliza.
El algoritmo específico depende del formato y la longitud del parámetro salt. La sal puede hacer que la encriptación sea más segura al aumentar la cantidad de cadenas generadas por una cadena específica del método de encriptación.
Aquí hay algunas constantes utilizadas junto con la función crypt(). Los valores de estas constantes se establecen durante la instalación por PHP.
Constantes:
[CRYPT_SALT_LENGTH] | Longitud de encriptación predeterminada. Utiliza encriptación DES estándar, longitud de 2. |
[CRYPT_STD_DES] | El hash basado en el algoritmo DES estándar utiliza dos caracteres del conjunto "./0-9A-Za-z" como valor de sal. El uso de caracteres ilegales en la sal causará que crypt() falle. |
[CRYPT_EXT_DES] | Hash extendido basado en el algoritmo DES. El valor de sal es una cadena de 9 caracteres, compuesta por un guión bajo seguido de 4 bytes de iteraciones y 4 bytes de valor de sal. Se codifican en caracteres impresos, cada uno de 6 bits, priorizando los bits válidos más bajos. De 0 a 63 se codifica como "./0-9A-Za-z". El uso de caracteres ilegales en la sal causará que crypt() falle. |
[CRYPT_MD5] | La dispersión MD5 utiliza una cadena de 12 caracteres de sal que comienza con $1$. |
[CRYPT_BLOWFISH] | El algoritmo Blowfish utiliza la siguiente sal: "$2a$", un parámetro cost de dos dígitos, "$" y una cadena de 64 bits compuesta por caracteres de "./0-9A-Za-z". El uso de caracteres fuera de este rango en la sal causará que crypt() devuelva una cadena vacía. Los dos dígitos del parámetro cost son el logaritmo en base 2 del número de vueltas, que varía en el rango 04-31. Los valores fuera de este rango causarán que crypt() falle. |
CRYPT_SHA256 | El algoritmo SHA-256 utiliza una cadena de 16 caracteres de sal que comienza con $5$ para la dispersión. Si la cadena de sal comienza con "rounds=<N>$", el valor numérico de N se utiliza para especificar el número de veces que se ejecutarán las vueltas de dispersión, algo similar al parámetro cost del algoritmo Blowfish. El número de vueltas por defecto es 5000, el mínimo es 1000 y el máximo es 999,999,999. Los valores de N fuera de este rango se convertirán en el valor más cercano. |
CRYPT_SHA512 | El algoritmo SHA-512 utiliza una cadena de 16 caracteres de sal que comienza con $6$ para la dispersión. Si la cadena de sal comienza con "rounds=<N>$", el valor numérico de N se utiliza para especificar el número de veces que se ejecutarán las vueltas de dispersión, algo similar al parámetro cost del algoritmo Blowfish. El número de vueltas por defecto es 5000, el mínimo es 1000 y el máximo es 999,999,999. Los valores de N fuera de este rango se convertirán en el valor más cercano. |
En sistemas que soportan múltiples algoritmos, si se soportan los constantes anteriores, configurelas en "1", de lo contrario, configurelas en "0".
Comentarios:No hay una función de desencriptación correspondiente. La función crypt() utiliza un algoritmo de un solo sentido.
Sintaxis
crypt(str,sal)
Parámetros | Descripción |
---|---|
str | Obligatorio. Define la cadena que se debe codificar. |
sal | Opcional. Cadena utilizada para aumentar la cantidad de caracteres codificados para mayor seguridad. Si no se proporciona el parámetro salt, PHP generará uno aleatorio cada vez que se llame a la función. |
Detalles técnicos
Valor devuelto: | Devuelve la cadena encriptada o una cadena menor de 13 caracteres, para poder distinguirla de la sal en caso de fallo. |
Versión de PHP: | 4+ |
Registro de actualizaciones
Versión | Descripción |
---|---|
5.3.2 | Basado en la implementación de Ulrich Drepper, se han añadido crypt basados en los algoritmos SHA-256 y SHA-512. |
5.3.2 | Corregido el problema del algoritmo Blowfish debido a bucles ilegales, devolviendo la cadena "fallido" ("*0" o "*1") en lugar de recurrir al algoritmo DES. |
5.3.0 | PHP ahora incluye su propia implementación de MD5 Crypt, incluyendo el algoritmo DES estándar, el algoritmo DES extendido y el algoritmo Blowfish. Si el sistema carece de la implementación correspondiente, PHP utilizará su propia implementación. |
Ejemplo
Ejemplo 1
En este ejemplo, vamos a probar diferentes algoritmos:
<?php // Salt de dos caracteres if (CRYPT_STD_DES == 1) { echo "DES estándar: ".crypt('something','st')."\n<br>"; } else { echo "DES estándar no es compatible.\n<br>"; } // Salt de 4 caracteres if (CRYPT_EXT_DES == 1) { echo "DES extendido: ".crypt('something','_S4..some')."\n<br>"; } else { echo "DES extendido no es compatible.\n<br>"; } // Con $1$ comienza 12 caracteres if (CRYPT_MD5 == 1) { echo "MD5: ".crypt('something','$1$somethin$')."\n<br>"; } else { echo "MD5 no es compatible.\n<br>"; } // Con salt开始 con $2a. Parámetro de costo de dos dígitos: 09. 22 caracteres if (CRYPT_BLOWFISH == 1) { echo "Blowfish: ".crypt('something','$2a$09$anexamplestringforsalt$')."\n<br>"; } else { echo "Blowfish DES no es compatible.\n<br>"; } // El sal se inicia con $5$ y es de 16 caracteres. El número predeterminado de vueltas es 5000. if (CRYPT_SHA256 == 1) { echo "SHA-256: ".crypt('something','$5$rounds=5000$anexamplestringforsalt$')."\n<br>"; else { echo "SHA-256 no es compatible.\n<br>"; } // El sal se inicia con $5$ y es de 16 caracteres. El número predeterminado de vueltas es 5000. if (CRYPT_SHA512 == 1) { echo "SHA-512: ".crypt('algo','$6$rounds=5000$anexamplestringforsalt$'); } else { echo "SHA-512 no es compatible."; } ?>
La salida del código anterior (dependiendo del sistema operativo):
DES Estándar: stqAdD7zlbByI DES Extendido: _S4..someQXidlBpTUu6 MD5: $1$somethin$4NZKrUlY6r7K7.rdEOZ0w. Blowfish: $2a$09$anexamplestringforsaleLouKejcjRlExmf1671qw3Khl49R3dfu SHA-256: $5$rounds=5000$anexamplestringf$KIrctqsxo2wrPg5Ag/hs4jTi4PmoNKQUGWFXlVy9vu9 SHA-512: $6$rounds=5000$anexamplestringf$Oo0skOAdUFXkQxJpwzO05wgRHG0dhuaPBaOU/ oNbGpCEKlf/7oVM5wn6AN0w2vwUgA0O24oLzGQpp1XKI6LLQ0.