Foros del Web » Programando para Internet » PHP »

Uso de Blowfish en PHP

Estas en el tema de Uso de Blowfish en PHP en el foro de PHP en Foros del Web. Hola, buenos días... Estoy haciendo un formulario para registrar usuarios en una base de datos. Regularmente usaba el método por md5 para registrar los passwords ...
  #1 (permalink)  
Antiguo 06/02/2014, 09:55
Avatar de Middrel  
Fecha de Ingreso: abril-2005
Mensajes: 835
Antigüedad: 19 años
Puntos: 27
Uso de Blowfish en PHP

Hola, buenos días...

Estoy haciendo un formulario para registrar usuarios en una base de datos. Regularmente usaba el método por md5 para registrar los passwords de los usuarios, pero estaba leyendo que es mejor usar el método de Blowfish, del cuál aún tengo algunas dudas:

Por ejemplo, tengo el siguiente código:

Código PHP:
if(isset($_POST['agregar'])){

        
        
$user trim(mysqli_real_escape_string($connect$_POST['user'])); // Obligatorio
        
$alias trim(mysqli_real_escape_string($connect$_POST['aliase'])); // Obligatorio
        
$pass trim(mysqli_real_escape_string($connect$_POST['pass'])); // Obligatorio
        
$conf trim(mysqli_real_escape_string($connect$_POST['conf'])); // Obligatorio
        
$email trim(mysqli_real_escape_string($connect$_POST['email'])); // Obligatorio
        
$grupo trim(mysqli_real_escape_string($connect$_POST['grupo'])); // Obligatorio
        
$modulos trim(mysqli_real_escape_string($connect$_POST['modulos']));
        
$pattern '^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,15}$^';

        
// Realizamos las validaciones de cada uno de los campos obligatorios.
        
if(empty($user)){ $Error01 'El campo de usuario no puede quedar incompleto.'; }
        elseif(empty(
$alias)){ $Error02 'No puedes dejar incompleto el alias.'; }
        elseif(empty(
$pass)){ $Error03 'El campo del password no puede ir vacío.'; }
        elseif(!
preg_match($pattern$pass)){ $Error04 'Error de password'; }
        elseif(
$pass != $conf){ $Error05 'Los passwords no coinciden'; }
        elseif(empty(
$email)){ $Error06 'No puede ir vacío el campo de email'; }
        elseif(!
filter_var($emailFILTER_VALIDATE_EMAIL)){ $Error07 'El email es inválido.'; }
        else {

                
$crypt crypt($pass'$2a$%02d$');
                echo 
$crypt;
        }
    } 
Según en el manual, debo utilizar la función crypt(), pero aún tengo duda del segundo argumento que se utiliza, por el momento uso $2a$%02d$, pero en sí, ¿este segundo argumento que realiza?

y por otro lado, este password lo almacenaré en una base de datos, ¿qué tamaño debe tener el campo que lo contenga? por ejemplo en md5, me pedía que fueran 32 caracteres, pero en este caso no veo que haya un tamaño predefinido.

De antemano, agradezco por sus comentarios. Saludos!!
  #2 (permalink)  
Antiguo 06/02/2014, 10:18
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años
Puntos: 326
Respuesta: Uso de Blowfish en PHP

Técnicamente, deberias usar como salt (segundo argumento), algo así

$2a$ +
XX (dos dígitos a tu eleccion) +
$ +
salt +
$


Es decir, una cadena, por ejemplo "$2a$99$<frase de 22 caracteres (salt)>$"

Según la doc:
Código:
CRYPT_BLOWFISH - Hash con Blowfish con un salt como sigue: "$2a$", "$2x$" o "$2y$", un parámetro de coste de dos dígitos, "$", y 22 caracteres del alfabeto "./0-9A-Za-z". Utilizar caracteres fuera de este rango en el salt causará que crypt() devuelva una cadena de longitud cero. El parámetro de coste de dos dígitos es el logaritmo en base 2 de la cuenta de la iteración del algoritmo hach basado en Blowfish subyacente, y debe estar en el rango 04-31; los valores fuera de este rango causarán que crypt() falle. Las versiones de PHP anteriores a 5.3.7 únicamente admitían "$2a$" como el prefijo para salt: PHP 5.3.7 introdujo los nuevos prefijos para corregir un problema de seguridad en la implementación de Blowfish. Por favor, consulte » este documento para detalles copletos de la corrección de seguridad, pero para resumir, los desarrolladores que se oriente por PHP 5.3.7 y posteriores deberían usar "$2y$" en vez de "$2a$".
El salt es... como si fuera una "key" privada, por decir algo. Así es más complicado sacar un decrypt por fuerza bruta. Si yo pongo el pass "hola", tu estas añadiendo una frase en plan "holaAsdshadisdahudsiHUAUISHD" por ponder algo. Si "desencriptas", seguiria sin ir el pass! (PD: Es un ejemplo básico, no tiene pq funcionar así en blowfish... :P)

El argumento en si es como si fueran las opciones de crypt, el tipo de crypt, y el salt :)

Saludos!

EDIT: No soy experto en este tema, puedo estar equivocado :)
__________________
>> Eleazan's Source
>> @Eleazan
  #3 (permalink)  
Antiguo 06/02/2014, 10:30
Avatar de Middrel  
Fecha de Ingreso: abril-2005
Mensajes: 835
Antigüedad: 19 años
Puntos: 27
Respuesta: Uso de Blowfish en PHP

Seas experto o no, me quedo más claro por el ejemplo que usaste :D

Entonces algo válido sería:

$2a$75$re45ty78swplmfds907cv6$

por citar un ejemplo.

Lo que me seguiría quedando como duda es que tamaño máximo tienen estás cadenas. No lo veo especificado.

Gracias por tus comentarios Eleazan!! Saludos!!
  #4 (permalink)  
Antiguo 09/02/2014, 11:59
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Uso de Blowfish en PHP

Si el ejemplo es valido pero 75$ de coste es muchisimo, supongo que sera parte del ejemplo , yo te recomiendo 7 u 8 , aunque te recomiendo ir probando por ti msimo mas valores y ver su rendimiento.

123 caracteres max si no me equivoco.

Última edición por webankenovi; 09/02/2014 a las 12:06

Etiquetas: formulario, sql, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:31.