Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Calcular la complejidad de una cotraseña (https://www.clubdelphi.com/foros/showthread.php?t=73614)

fide_uci 04-05-2011 23:50:47

Calcular la complejidad de una cotraseña
 
Hola amigos. Estoy haciendo un programa para administrar los usuarios de mi centro de trabajo y entre las tantas opciones existe una que es la de cambiar la contraseña del usuario seleccionado. Esta funcionalidad ya la he implementado y trabaja de maravillas. Ahora lo que necesito es que a medida que se valla escribiendo el password que se le va a asignar al usuario pues se vea un indicador que muestra el nivel de complejidad de la cotraseña que se esta escribiendo. Podria ser por ejemplo.

Nivel de Complejidad:
Baja
Media
Alta
Muy Alta

Algo como esto es lo que necesitaria. Hasta donde se para que una contraseña sea bastante segura debe cumplir con al menos tres de los siguientes requerimientos.

Tener 8 o más caracteres de longitud.
Contener Letras Minusculas.
Contener letras mayusculas.
Contener Numeros.
Contener Simbolos ( @, _, -, +,=, !, #, ., /)
Que no contenga palabras comunes, sustantivos o cosas así.

Pero bueno no se me ocurre como calcular la complejidad. Alguien que tenga experiencia o me pueda ayudar con este tema se lo voy a agradecer eternamente. Gracias desde ya.

Casimiro Noteví 05-05-2011 00:27:29

Cita:

Empezado por fide_uci (Mensaje 398951)
1.Tener 8 o más caracteres de longitud.
2. Contener Letras Minusculas. Contener letras mayusculas.
3. Contener Numeros.
4. Contener Simbolos ( @, _, -, +,=, !, #, ., /)
5. Que no contenga palabras comunes, sustantivos o cosas así.


Puedes darle un porcentaje a cada uno de esos apartados, por ejemplo, si tiene más de 8 caracteres le sumas 20. Si tiene mayúsculas y minúsculas le sumas otro 20, si tiene números le sumas otro 20.
Como hay 5 apartados, por 20 puntos cada uno= 5*20=100%
Entonces si cumple con todos, o sea, el valor es 100, es muy segura.
Si se queda en 80, segura.
Si se queda sólo en 20, insegura.
Si se queda en 0, es una birria de contraseña o no ha puesto ninguna :D

fide_uci 05-05-2011 00:33:43

Ajajaja, amigo mio si. Entiendo tu punto y pense en hacerlo asi. Ahora una cosa. Como era que se verificaba si un caracter estaba en un conjunto dado, ejemplo 'a'..z, 'A'..'Z', '0'..'9',
era in o sea char in 'a'..'z' o algo asi no?

Lo otro, como puedo saber si es un sombolo lo que esta en la posicion de un caracter. Ejemplo. *, &, #, $, % ! etc. ??

fide_uci 05-05-2011 02:02:12

Me pueden decir por que este codigo no me funciona?.
La parte donde valido si el caracter esta en un conjunto no se ejecuta, por que puede ser?

Código Delphi [-]
var
  vLetras_Up_Set: set of 'A'..'Z';
  vLetras_Low_Set: set of 'a'..'z';
  vNum_Set: set of '0'..'9';
  vActChar: Char;
  vX, vComplejidad: Integer;
  vLetraMinContada, vLetraMayuscContada, vNumeroContado, vSimboloContado: Boolean;
begin

  //si el caracter que se esta procesando no esta en ningunode estos conjuntos,
  //entonces debe ser un simbolo u otro caracter y se incrementa el contador.

  if edt_new_pass_show.Text = '' then
    Exit;

  edt_new_pass.Text := edt_new_pass_show.Text;
  vComplejidad := 0;
  vLetraMinContada := False;
  vLetraMayuscContada := False;
  vNumeroContado := False;
  vSimboloContado := False;
  
  //Aqui es donde se calcula todo
  for vX := 1 to Length(edt_new_pass_show.Text) do
    begin
      vActChar := edt_new_pass_show.Text[vX];

      //El caracter actual es una mayuscula
      if (vActChar in vLetras_Up_Set) and not vLetraMayuscContada then
        begin
          ShowMessage('Se conto una mayuscula');
          Inc(vComplejidad);
          vLetraMayuscContada := True;
        end
      else
      //El caracter actual es una minuscula
      if (vActChar in vLetras_Low_Set) and not vLetraMinContada then
        begin
          Inc(vComplejidad);
          vLetraMinContada := True;
        end
      else
      //El caracter actual es un numero
      if (vActChar in vNum_Set) and not vNumeroContado then
        begin
          Inc(vComplejidad);
          vNumeroContado := True;
        end  
      else
      //El caracter actual es un simbolo
      if not vSimboloContado then
        begin
          ShowMessage('Se conto un simbolo');
          Inc(vComplejidad);
          vSimboloContado := True;
        end;  
    end;


   //ShowMessage(IntToStr(vComplejidad));
  //Si la longitud es menor de 8 caracteres entonces no es segura para nada
  if Length(edt_new_pass_show.Text) < 8 then
    vComplejidad := 1
  else
    Inc(vComplejidad);

  case vComplejidad of
    1: lb_complejidad.Caption := 'Complejidad: Extremadamente insegura';
    2: lb_complejidad.Caption := 'Complejidad: Poco segura';
    3: lb_complejidad.Caption := 'Complejidad: Segura';
    4: lb_complejidad.Caption := 'Complejidad: Muy Segura';
    5: lb_complejidad.Caption := 'Complejidad: Extremadamente segura';
  end;

end;

gatosoft 05-05-2011 03:50:37

Varias observaciones...

1) seria prudente encerrar cada condicion compuesta de los if en paréntesis...

Código Delphi [-]
  if (vActChar in vLetras_Up_Set) and not vLetraMayuscContada then

Código Delphi [-]
 if (vActChar in vLetras_Up_Set) and (not vLetraMayuscContada) then

Solo un capricho, pero la experiencia despues te dirá por que...

2) tienes un problema de logica con los if.. else if...

por ejemplo, si tienes un password como: "hola"

entonces... la primera vez evalua y encuentra una minuscula..
la segunda vez que pasa por el for, no entra a la minuscula, sino que va derecho al caracter... y en adelante no cuenta nada... total: una minuscula y un caracter para la palabra "hola".

dices que no llega a evaluar carcateres?? es poco probable, pues casi todo va a parar alla... hiciste un seguimiento paso a paso?? has revisado lo que almacenan los conjuntos... es decir, no es lo mismo si trabajas con delphi 7 a delphi 2010, pues en este útlimo hay cambios de char a ansichar... revisa este tema


3) Veo que si el password es menor de 8 caracteres automaticamente reseteas la coplejidad a uno... yo preferiria dar pesos a cada condicion, es decir:

1) que tenga mas de 8 caracteres: 30 puntos
2) que tenga una minuscula: 5 puntos
3) que tenga una mayuscula: 20 puntos
4) que tenga un carcater: 30 puntos.
5) que tenga un numero: 15 puntos

total 100 puntos... y evaluas la complejidad segun la puntuación... es casi lo mismo... pero...

Ñuño Martínez 05-05-2011 09:54:40

Cita:

Empezado por gatosoft (Mensaje 398970)
1) seria prudente encerrar cada condicion compuesta de los if en paréntesis...

No sólo es prudente sino que muchas veces es imprescindible, ya que la precedencia de los operadores lógicos está al mismo nivel que los aritméticos, no como en otros lenguajes como el C donde están en otro nivel.


La franja horaria es GMT +2. Ahora son las 07:53:44.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi