[PHP] cifrado de cifrado (irreversible)

cripta (cifrado irreversible)

cripta (cadena  $str [, cadena  $salt ]): cadena

Parámetros 
* str: la cadena a la que se aplicará el hash. 
* sal - opcional. Una cadena que se utiliza para aumentar la cantidad de caracteres codificados y hacer que la codificación sea más segura. Si no se proporciona el parámetro salt, se generará uno aleatoriamente cada vez que se llame a la función.

Advertencia : ¡Esta función no es (todavía) binaria segura! (¡Esta función aún no es binaria segura!)

La función crypt () devuelve una cadena cifrada mediante algoritmos DES, Blowfish o MD5. Si falla, devuelve una cadena de menos de 13 caracteres y se garantiza que será diferente de salt.

El comportamiento de esta función es diferente en diferentes sistemas operativos y algunos sistemas operativos admiten más de un tipo de algoritmo. Durante la instalación, PHP verificará qué algoritmos están disponibles y qué algoritmos se utilizan.

El algoritmo exacto depende del formato y la longitud del parámetro de sal. Salt puede hacer que el cifrado sea más seguro al aumentar la cantidad de cadenas generadas por una cadena específica y un método de cifrado específico.

A continuación se muestran algunas constantes que se utilizan con la función crypt (). PHP establece estos valores constantes durante la instalación.

  • [CRYPT_SALT_LENGTH] -La longitud de cifrado predeterminada. Utilice cifrado DES estándar, longitud 2
  • [CRYPT_STD_DES] -Un salt estándar de 2 caracteres basado en el cifrado DES, del alfabeto "./0-9A-Za-z". El uso de caracteres no válidos en la sal hará que la función falle.
  • [CRYPT_EXT_DES] -Sal extendido basado en DES con 9 caracteres, que consta de un guión bajo, 4 bytes de iteraciones y 4 bytes de sal. Estos se codifican como caracteres imprimibles con 6 bits por carácter, con el carácter menos significativo primero. Los valores de 0 a 63 se codifican como "./0-9A-Za-z". El uso de caracteres no válidos en la sal hará que la función falle.
  • [CRYPT_MD5] -MD5 salt encriptado con 12 caracteres, comenzando con $ 1 $.
  • [CRYPT_BLOWFISH] -El cifrado Blowfish tiene una sal que comienza con $ 2a $, $ 2x $ o $ 2y $, un parámetro de costo de dos dígitos "$" y el alfabeto "./0-9A-Za-z" 22 caracteres en . El uso de caracteres fuera del alfabeto hará que la función devuelva una cadena de longitud 0. El parámetro "$" es el logaritmo del número de iteraciones basado en el algoritmo de hash Blowfish con base 2 y debe estar en el rango 04-31. Los valores fuera de este rango harán que la función falle.
  • [CRYPT_SHA_256] -SHA-256 salt cifrado con 16 caracteres, comenzando con $ 5 $. Si la cadena de sal comienza con "rondas = <N> $", el valor numérico de N se usa para indicar el número de veces que se ejecuta el bucle hash, que es similar al parámetro de costo en Blowfish. El número predeterminado de ciclos es 5000, el mínimo es 1000 y el máximo es 999,999,999. Cualquier valor de N fuera de este rango se convertirá al valor límite más cercano.
  • [CRYPT_SHA_512] -SHA-512 salt cifrado con 16 caracteres, comenzando con $ 6 $. Si la cadena de sal comienza con "rondas = <N> $", el valor numérico de N se usa para indicar el número de veces que se ejecuta el bucle hash, que es similar al parámetro de costo en Blowfish. El número predeterminado de ciclos es 5000, el mínimo es 1000 y el máximo es 999,999,999. Cualquier valor de N fuera de este rango se convertirá al valor límite más cercano.

En los sistemas en los que esta función admite varios algoritmos, la constante anterior se establece en "1" si la admite; de ​​lo contrario, se establece en "0".

Nota: No hay una función de descifrado correspondiente. La función crypt () utiliza un algoritmo unidireccional.

Sal

Al personalizar el valor de la sal:

Cuando se escribe un valor de sal, tome los dos primeros caracteres como valor de sal (devuélvalo si tiene menos de dos caracteres *0): 

$str = '123456';
$salt = "test";
echo crypt($str, $salt);
// 结果:teMGKvBPcptKo

$str = '123456';
$salt = "abctest";
echo crypt($str, $salt);
// 结果:ab01FAX.bQRSU

Cuando menos de dos caracteres:

$str = '123456';
$salt = "a";
echo crypt($str, $salt);

Los resultados son los siguientes:

Cuando el valor de la sal no está escrito:

El valor de sal se genera automáticamente cuando no está escrito.

$str = '123456';
$res = crypt($str);
echo $res;
// 结果:$1$W0YtLdHC$GCYyvP3n5G1lp0WzetQu.0

En este momento, el resultado completo $ res obtenido por crypt () debe usarse como sal para la verificación de la contraseña, a fin de evitar problemas causados ​​por el uso de diferentes algoritmos hash. (Como se mencionó anteriormente, el hash de contraseña basado en el algoritmo DES estándar usa un valor de sal de 2 caracteres, pero el hash basado en el algoritmo MD5 usa un valor de sal de 12 caracteres). Para prevenir ataques basados ​​en el tiempo, PHP 5.6 proporciona un método de comparación de cadenas más segurohash_equals()

$str_input1 = "123456";
if (hash_equals($res, crypt($str_input, $res))) {
    echo "Password verified!";
} else {
    echo "Password failed!";
}
// 结果:Password verified!


$str_input2 = "12345";
if (hash_equals($res, crypt($str_input, $res))) {
    echo "Password verified!";
} else {
    echo "Password failed!";
}
// 结果:Password failed!

Sobre el algoritmo

Entonces, ¿cómo juzga la cripta los diferentes algoritmos en función del valor de la sal? De hecho, coincide con el valor de la sal de acuerdo con ciertas reglas. Si cumple con las reglas de un determinado algoritmo, significa qué algoritmo se utiliza. Echemos un vistazo a los algoritmos admitidos actualmente uno por uno.

1. DES estándar (DES estándar)

Si ningún otro algoritmo coincide, se utiliza el algoritmo DES estándar. En este momento, los dos primeros caracteres se toman como valor de sal (se devolverán menos de dos caracteres *0):

echo crypt('rasmuslerdorf', 'rl');

// 输出结果如下:
// rl.3StKT.4T8M

Los caracteres en el valor de sal deben ser ./0-9A-Za-zlos caracteres en, de lo contrario causará que crypt () falle (probado personalmente, parece que el rango de caracteres es mayor de lo que dice el documento).

Cuando se usa este algoritmo, $strsolo se toman los primeros 8 caracteres, por lo que no importa cuán larga sea la cadena, si los primeros 8 caracteres son iguales, el valor hash devuelto es el mismo si el valor de sal es el mismo.

2. DES extendido (DES extendido)

_Comience con un guión bajo , seguido de un recuento de iteraciones de 4 bytes y un valor de sal de 4 bytes:

echo crypt('rasmuslerdorf', '_J9..rasm');

// 输出结果如下:
// _J9..rasmBYk8r9AiWNc

Del mismo modo, los caracteres de 8 bytes deben ser ./0-9A-Za-zlos caracteres que están dentro.

3.MD5

Al $1$principio, el valor de sal tiene menos de 12 caracteres:

echo crypt('rasmuslerdorf', '$1$rasmusle$');

// 输出结果如下:
// $1$rasmusle$rISCgZzpwk3UhDidwXvin0

De hecho, en el ejemplo del $1$rasmusle$último cambio no afectará los resultados de ningún personaje, por ejemplo, $1$rasmusleay $1$rasmusle1los resultados obtenidos con $1$rasmusle$el mismo, porque el último debe ser $, si no, automáticamente llenado. Por ejemplo, se $1$rasmvolverá $1$rasm$, se $1$volverá $1$$.

4 pez globo

Para $2a$, $2x$o $2y$al principio, seguido de un costnúmero de parámetros de dos dígitos, seguido de un $carácter y, finalmente, el ./0-9A-Za-zrango de 22 caracteres:

echo crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$');

// 输出结果如下:
// $2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi

Se utilizan dos dígitos para indicar el número de iteraciones del algoritmo Blowfish, es un logaritmo con base 2 y el rango es 04-31. Antes de PHP 5.3.7, la versión solo se admite $2a$como prefijo, después de 5.3.7, agrega $2x$y $2y$dos tipos de prefijos para abordar algunos de los problemas de seguridad . Si usa la versión 5.3.7 o superior, se recomienda $2y$.

Al usar este algoritmo, $strse admiten hasta 72 caracteres y, si se excede, se truncará.

5.SHA256

Al $5$principio, el valor de las sales de 16 caracteres también se puede usar antes del valor de la sal rounds=<N>$multiplicado por un formato de tabla del ciclo Mingha Xi (N):

echo crypt('rasmuslerdorf', '$5$rounds=5000$usesomesillystringforsalt$');

// 输出结果如下:
// $5$rounds=5000$usesomesillystri$KqJWpanXZHKq2BOB43TSaYhEWsQ1Lr5QNyPCDH/Tp.6

roundsEl valor predeterminado es 5000 y el rango es de 1000 a 999 999 999. Si N no está en este rango, se interceptará al rango más cercano.

El algoritmo agregado en PHP 5.3.2, la implementación del algoritmo se basa en la implementación de Ulrich Drepper .

6.SHA512

Al $6$principio, el valor de las sales de 16 caracteres también se puede usar antes del valor de la sal rounds=<N>$multiplicado por un formato de tabla del ciclo Mingha Xi (N):

echo crypt('rasmuslerdorf', '$6$rounds=5000$usesomesillystringforsalt$');

// 输出结果如下:
//$6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21

roundsEl valor predeterminado es 5000 y el rango es de 1000 a 999 999 999. Si N no está en este rango, se interceptará al rango más cercano.

El algoritmo agregado en PHP 5.3.2, la implementación del algoritmo se basa en la implementación de Ulrich Drepper .

 

Cómo determinar qué algoritmo es compatible

cryptSe proporcionan las siguientes constantes para identificar si un algoritmo es compatible (1 significa soporte, 0 significa no):

  • CRYPT_STD_DES

  • CRYPT_EXT_DES

  • CRYPT_MD5

  • CRYPT_BLOWFISH

  • CRYPT_SHA256

  • CRYPT_SHA512

Acerca de los resultados de salida

Como puede ver en la salida de los ejemplos anteriores, cryptel resultado de la salida del método en realidad contiene el valor de sal en sí. Por lo tanto, podemos saber a partir del resultado de salida qué algoritmo y qué valor de sal se utilizó para el cálculo.

Además, si el valor de sal contiene caracteres ilegales, por ejemplo, normalmente se requiere que el valor de sal sea ./0-9A-Za-zun carácter en el rango; de lo contrario, cryptse devolverá el resultado *0. Además, en la versión de rama 5.5 antes de 5.5.21 y la versión de rama 5.6 antes de 5.6.5, si $saltel valor es *0, se devolverá un valor hash utilizando el algoritmo DES y se devolverá la versión posterior *1.

 

if (CRYPT_STD_DES == 1) {
    echo "Standard DES: " . crypt('rasmuslerdorf', 'rl');
}
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";
}

Los resultados son los siguientes:

 

 

 

 

 

 

referencia:

https://www.php.net/manual/zh/function.crypt.php

https://www.runoob.com/php/func-string-crypt.html

https://segmentfault.com/a/1190000009219416

Supongo que te gusta

Origin blog.csdn.net/I_lost/article/details/105293641
Recomendado
Clasificación