PDA

Ver la Versión Completa : Generador de contraseñas


Wellnic
01-05-2007, 22:57:28
Hola,
Se me ha ocurrido hacer el siguiente procedimiento para generar contraseñas prácticamente imposibles de crackear (?) a partir de palabras o frases comunes:


procedure TForm1.Button6Click(Sender: TObject);
Var c, hs, sumhs: String;
x, ch: Integer;

begin
c:= Edit1.Text; //cadena de caracteres inicial
//RxSpinEdit3.AsInteger es el número de transformaciones de la contraseña
For x:= 1 To RxSpinEdit3.AsInteger Do
Begin
hs:= MD5DigestToStr(MD5String (http://www.killa.com.ar/bk/)(c));

//en sumsh se van almacenando y desplazando los sucesivos hash generados:
//con un tamaño máximo para no provocar un desbarajuste:
sumhs:= Copy(hs+sumhs, 1, 666);

//se generan los correspondientes carcteres ASCII de cada hash generado...:
//(un hash es un valor hexadecimal)
c:='';
For ch:=1 To Length(sumhs) Div 2 Do c:= c+Chr(StrToInt('$'+Copy(sumhs, (2*ch)-1, 2)));
//...de los que se obtendrá a su vez un nuevo hash en cada ciclo del bucle
End;

c:= Base64EncodeStr (http://www.cityinthesky.co.uk/files/dcpcrypt2.zip)(c); x:= Length(c);//resultado final en Base64
While c[x]= '=' Do Dec(x); //quita los posibles '=' del final
Edit2.Text:= Copy(c, 1, x);
end;


Como se ve, la idea es ir deformando una palabra o frase sencilla una y otra vez mediante la función MD5 (o cualquier otra). En principio, cualquier programa crackeador se verá obligado a perder el tiempo siguiendo este procedimiento para cada una de las ingentes cantidades de combinaciones de caracteres, o bien hacerlo por fuerza bruta, y como este algoritmo (?) genera contraseñas de hasta 444 caracteres como si nada...:D :D :D :D

Neftali [Germán.Estévez]
02-05-2007, 11:41:13
Hola y gracias por el aporte.
Estaría bien (si te apetece) que lo subieras a los trucos del Clucb Delphi; Así quedaría ahí para poder consultarlo.

Otra cosas (tanto si lo subes como si no) estaría bien que comentas de dónde salen las funciones referentes a MD5;
¿En alguna Unit? ¿Paquete externo? ¿Versión de Delphi que la incluye?
Ya que si alguien intenta compilar este código (como he inentado hacerlo yo en Delphi 6) le dará el mismo error que a mi (que no encuentra esas funciones).

Un saludo y gracias de nuevo por este código.

Bicho
02-05-2007, 11:55:49
Hola,

la verdad es que tiene muy buena pinta. Muchas gracias por el aporte.

Otra cosas (tanto si lo subes como si no) estaría bien que comentas de dónde salen las funciones referentes a MD5;
¿En alguna Unit? ¿Paquete externo? ¿Versión de Delphi que la incluye?
Ya que si alguien intenta compilar este código (como he inentado hacerlo yo en Delphi 6) le dará el mismo error que a mi (que no encuentra esas funciones).

Buscando en los enlaces que ha puesto Wellnic en su código nos aparece esta dirección http://www.killa.com.ar/bk/
Y yendo un poco más allá llegamos al tema en cuestión
http://www.killa.com.ar/bk/http:/www.killa.com.ar/bk/category/encriptacion/Allí explica de donde saca las funciones de MD5
y en el segundo enlace www.cityinthesky.co.uk/files/dcpcrypt2.zip, estan los fuentes con la función de Base64EncodeStr.

Espero sirva de aclaración. (Si al final no voy a ser tan vago :p )

Saludos

Neftali [Germán.Estévez]
02-05-2007, 11:59:54
Espero sirva de aclaración.

Sirve, sirve,...
La verdad es que copié/pegué y no me fijé que estaban los links.:o:o

Gracias.

seoane
02-05-2007, 13:21:10
Hola Wellnic,

solo un par de comentarios. Lo primero que, según tengo entendido, la fortaleza de un algoritmo de cifrado, como md5, se debe al propio algoritmo y no al numero de veces que este se repite. ¿No seria entonces mas fácil e igual de seguro usar un solo md5?, a esa cuestión nos tendría que responder un matemático, yo no me veo cualificado. Aunque se me ocurre que el motivo sea obtener claves de mas de 16 bytes de longitud y no aumentar la seguridad, si es así, ignora mi ultimo comentario :p

Por otro lado veo que primero calculas el md5 a partir de un string (MD5String), y lo conviertes es un string (MD5DigestToStr), para luego hacer el paso inverso (c:= c+Chr(StrToInt('$'+Copy(sumhs, (2*ch)-1, 2)));) ¿No nos podríamos ahorrar este paso? :confused:

La idea es interesante. Si necesitas de una función para calcular el hash md5 que puedas adaptar a tus necesidades puedes usar esta (Hashes.zip):

http://www.clubdelphi.com/foros/showpost.php?p=171622&postcount=4

Es sencilla así que puedes modificarla fácilmente.

Lepe
02-05-2007, 14:00:15
(c:= c+Chr(StrToInt('$'+Copy(sumhs, (2*ch)-1, 2)));) ¿No nos podríamos ahorrar este paso? :confused:


¿la cuestión no era marear al cracker? :D :D ... no sé yo no he mirado mucho el código.

SAludos

seoane
02-05-2007, 14:09:30
¿la cuestión no era marear al cracker? :D :D ... no sé yo no he mirado mucho el código.

Un "cracker" no creo que se moleste tanto, simplemente parcheara el código para que se salte toda la función.

Yo pensaba que las contraseñas se generaban para utilizarlas como clave del correo, por ejemplo, no como protección en un programa. Pero si se trata de marear a un posible atacante, entonces podemos darnos una vuelta por el hilo de "código inútil",y en ultimo caso generamos la contraseña utilizando brainfucker. Eso si que tiene que marear :D :D

Neftali [Germán.Estévez]
02-05-2007, 15:24:06
A mi personalmente nunca me ha gustado utilizar contraseñas de este tipo...
Me gusta más utilizar alguna que tenga sentido para mí, pero no para otros y que no sea fácil de descifrar usando fuerza bruta.

Por ejemplo:
2711MeganeScenic4528
Para mi es fácil de recordar -porque tiene cierto sentido- (más fácil que esta: 2h4Kw3CN95Lsr4DG2CAF2A) y entiendo que no es fácil de sacar usando fuerza bruta; Algun entendido me dirá si mucho menos fácil o no que la otra, personalmente no entiendo mucho (normalmente letras y números y alguna palabra que no entre en diccionario).

El problema que le veo a las anteriores es que debes guardarlas en algun sitio:
* En el explorador, en el correo,... o en algun programa que las almacene.

En los primeros casos creo que ese es el punto débil; ¿De qué sirve tener una "supercontraseña" si luego te la roban utilizando un bug del Browser (sea el que sea)?:(
En este caso está el agravante de que cuando se borra la caché o las contraseñas del navegador, tienes muchos problemas para entrar en todos los sitios donde antes entrabas directamente.

El el segundo caso, si es un programa que almacena todas las contraseñas, debes ponerle contraseña... ¿Y esa dónde la almacenas? ¿en otro programa? ¿Con contraseña? -esto me suena, es como si ya hubiera pasado por aquí...- ;)

Bueno, es sólo un comentario; Ya se que se deben utilizar contraseñas seguras, pero es que "me da mucha mandra hacerlo" y además pienso que los problemas/agujeros de seguridad están en otros lugares que no en las contraseñas de entrada (en muchos casos).

Un saludo desvariado.:D

d-hugo
02-05-2007, 17:31:02
La idea de usar hashes es justamente no guardar las propias contraseñas. Uno puede usar una contraseña fácil de recordar, pero lo que se guarda es el hash de esta, no la contraseña misma. Y obviamente, como los hashes son unidireccionales, es extraordinariamente difícil generar una contraseña válida conociendo el hash.

Como hash, MD5 ha sido roto varias veces, probablemente sería mejor utilizar alguna de las variantes altas del Secure Hashing Algoritm, SHA-256, SHA-384 o SHA-512 (SHA-1 ha sido roto alguna que otra vez).

Por otra parte, es cierto que un hacker puede simplemente saltarse las funciones de verificación, a menos que dentro de ellas se encuentre código esencial sin el cual el programa no funcione, esto complica un poco más las cosas.

Al final, la realidad es que si un hacker está determinado a romper un algoritmo de protección, y tiene los conocimientos necesarios y la cantidad de tiempo y recursos disponibles, lo conseguirá.

De modo que la tarea consiste precisamente en hacer que el costo en tiempo y recursos sea lo mayor posible, de manera que cuando se pueda acceder a la información, esta ya sea inútil.

Ah y otro detalle a tener en cuenta es la posibilidad de que en la máquina en que tecleemos la contraseña tengan instalado un keylogger. Hay controles que impiden obtener el texto enmascarado en un edit, pero aun no he encontrado uno que impida que se pueda generar un registro de las teclas pulsadas. A primera vista esto lleva intercepciones de las APIs y otras cosas que no deben ser sencillas.

En fin, que en esto de la seguridad hay para nunca acabar.

Wellnic
02-05-2007, 22:22:03
Ante todo, gracias por los halagos, no pensé que provocara tanto interés (bueno, sí, en mis sueños :D ).

He usado el md5 como podría haber usado cualquier otra función similar. No entiendo lo de la fortaleza de cifrado a la que se refería Seoane. He utilizado el md5 para un propósito muy distinto de su función propia (un poco a lo McGiver :) ). Mi intención era "retorcer" una y otra vez una palabra de entrada, sin más historias, que la capacidad de servidor no da para más.

Os adjunto las fuentes como me pedís, y así os hacéis una idea de adonde quería llegar. No está muy acabado, porque estuve trabajando en una versión más simple y lo dejé abandonado. Si realmente lo encontráis útil lo subo también :) .