tipos metodos encriptar encriptada encriptación encriptacion desencriptar contraseñas contraseña con php encryption bcrypt

metodos - tipos de encriptación php



Comparando contraseñas con crypt() en PHP (6)

BCrypt usa 128 bits para salt, por lo tanto, 22 bytes Base64, con solo dos bits del último byte que se está utilizando.

El hash se calcula utilizando el salt y la contraseña. Cuando pasa la contraseña encriptada, el algoritmo lee la fuerza, la sal (ignorando todo lo que está más allá de ella) y la contraseña que dio, y calcula el hash, agregándolo. Si tiene PostgreSQL y pg_crypto a la mano, SELECCIONE gen_salt (''bf''); le mostrará lo que de $ sal se está leyendo.

Aquí hay un ejemplo de código para la generación de sal, de mi implementación de .NET , test-vector-gen.php, alternativamente:

$salt = sprintf(''$2a$%02d$%s'', [strength goes here], strtr(str_replace( ''='', '''', base64_encode(openssl_random_pseudo_bytes(16)) ), ''ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'', ''./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789''));

No hay razón para usar la misma sal para todas sus contraseñas. La sal es parte de la salida de todos modos, por lo que no obtienes nada en comodidad ... aunque concedo que PHP debería tener una función gen_salt incorporada.

Necesito obtener los fundamentos de esta función. La documentación de php.net establece, para el algoritmo blowfish, que:

Blowfish hashing con una sal de la siguiente manera: "$ 2a $", un parámetro de costo de dos dígitos, "$", y 22 dígitos base de 64 del alfabeto "./0-9A-Za-z". El uso de caracteres fuera de este rango en el salt hará que crypt () devuelva una cadena de longitud cero

Así que esto, por definición, no debería funcionar:

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

Sin embargo, escupe:

$2a$07$usesomadasdsadsadsadaeMTUHlZEItvtV00u0.kb7qhDlC0Kou9e

Donde parece que crypt () ha reducido la sal a una longitud de 22. ¿Podría alguien explicar esto?

Otro aspecto de esta función que no puedo entender es cuando usan crypt () para comparar contraseñas. http://php.net/manual/en/function.crypt.php (ver ej. # 1). ¿Esto significa que si uso el mismo Salt para cifrar todas mis contraseñas, primero tengo que cifrarlas? es decir:

$salt = "usesomadasdsadsadsadae"; $salt_crypt = crypt($salt); if (crypt($user_input, $salt) == $password) { // FAIL WONT WORK } if (crypt($user_input, $salt_crypt) == $password) { // I HAVE TO DO THIS? }

Gracias por tu tiempo


Citando el manual

CRYPT_BLOWFISH - Blowfish hashing con una sal de la siguiente manera: "$ 2a $", un parámetro de costo de dos dígitos, "$", y 22 dígitos base del alfabeto

Nota: 22 base de 64 dígitos.


El siguiente ejemplo de código puede responder a sus preguntas.

Para generar una contraseña con hash utilizando Blowfish, primero debe generar un salt, que comienza con $ 2 a $ seguido de un recuento de iteraciones y 22 caracteres de la cadena Base64.

$salt = ''$2a$07$usesomadasdsadsadsadasdasdasdsadesillystringfors''; $digest = crypt(''rasmuslerdorf'', $salt);

Almacene todo el $ digest en la base de datos, tiene tanto la sal como el digest.

Al comparar la contraseña, simplemente haga esto,

if (crypt($user_input, $digest) == $digest)

Estás reutilizando el compendio como sal. crypt sabe cuánto tiempo es la sal del identificador de algoritmo.


Esta pregunta está relacionada con mi respuesta a la respuesta de ZZ Coder. Básicamente, mi pregunta es sobre el almacenamiento del resultado crypt () en la base de datos. ¿Se supone que debo almacenar la salida completa en la base de datos, para que mi base de datos tenga este aspecto:

-------------------------------------------------------------------------------- | ID | Username | Password | -------------------------------------------------------------------------------- | 32 | testuser | $2a$07$usesomadasdsadsadsadaeMTUHlZEItvtV00u0.kb7qhDlC0Kou9e | --------------------------------------------------------------------------------

En caso afirmativo, ¿no desafía este tipo de propósito el uso de una sal en primer lugar? Si alguien obtiene acceso a la base de datos, ¿puede ver claramente la sal utilizada para el cifrado?

Pregunta extra: ¿Es seguro usar el mismo Salt para cada contraseña?


Primera pregunta:

Así que esto, por definición, no debería funcionar:

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

Donde parece que crypt () ha reducido la sal a una longitud de 22. ¿Podría alguien explicar esto?

No hay ningún problema con tener demasiados caracteres ... la frase Usar caracteres fuera de este rango en la sal hará que crypt () devuelva una cadena de longitud cero hacia afuera del rango de la base 64, no del rango de 22 personajes Intente colocar un carácter ilegal en la cadena de sal, y debería encontrar que obtiene un resultado vacío (o si coloca <22 caracteres, lo que da como resultado bytes vacíos ilegales).

Segunda pregunta:

Usted ingresa la contraseña almacenada encriptada como sal porque la cadena de sal siempre aparece (por diseño) en la cadena encriptada, y de esta manera se asegura de tener la misma sal para el cifrado de la contraseña almacenada y la ingresada por el usuario.


Nueva sal para cada contraseña

$password = ''p@ssw0rd''; $salt = uniqid('''', true); $algo = ''6''; // CRYPT_SHA512 $rounds = ''5042''; $cryptSalt = ''$''.$algo.''$rounds=''.$rounds.''$''.$salt; $hashedPassword = crypt($password, $cryptSalt); // Store complete $hashedPassword in DB echo "<hr>$password<hr>$algo<hr>$rounds<hr>$cryptSalt<hr>$hashedPassword";

Autenticación

if (crypt($passwordFromPost, $hashedPasswordInDb) == $hashedPasswordInDb) { // Authenticated