|
|
|
#1 (permalink) |
|
Messages: n/a
Hébergeur: |
Bonjour,
Je suis à la recherche d'un script codant en MD5. J'avais vu il y a plusieurs mois cela à l'occasion d'un concours sur le net, mais je ne retrouve pas. Vous avez une piste ? Merci et bonne nouvelle semaine à vous, Thierry -- 4 Calculs & Astronomie en Javascript : <http://astrophoto.free.fr> 3 " Il y a 10 sortes de personnes sur Terre : ceux qui connais- 2 sent le système binaire et ceux qui ne le connaissent pas " 1....'....12.....'....24.....'....36.....'....48.. ...'....60.....'....72 |
|
|
|
#2 (permalink) |
|
Messages: n/a
Hébergeur: |
Le Sun, 02 Sep 2007 18:36:30 +0200, Thierry Loiseau a écrit:
> Je suis à la recherche d'un script codant en MD5. J'avais vu il y a > plusieurs mois cela à l'occasion d'un concours sur le net, mais je ne > retrouve pas. > > Vous avez une piste ? http://actuel.fr.selfhtml.org/articl.../md5/index.htm (premier lien en mettant javascript et MD5 dans Google) -- Patrick Mevzek . . . . . . . . . . . . . . Dot and Co <http://www.dotandco.net/> <http://www.dotandco.com/> Dépêches sur le nommage <news://news.dotandco.net/dotandco.info.news> |
|
|
|
#3 (permalink) |
|
Messages: n/a
Hébergeur: |
Patrick Mevzek <pm-N200708@nospam.dotandco.com> wrote:
> > Vous avez une piste ? > > http://actuel.fr.selfhtml.org/articl.../md5/index.htm > > (premier lien en mettant javascript et MD5 dans Google) Ben oui, c'est tout simplement cela ! Merci Patrick ! En copie ci-dessous le script : /* * md5.js 1.0b 27/06/96 * * Javascript implementation of the RSA Data Security, Inc. MD5 * Message-Digest Algorithm. * * Copyright (c) 1996 Henri Torgemane. All Rights Reserved. * * Permission to use, copy, modify, and distribute this software * and its documentation for any purposes and without * fee is hereby granted provided that this copyright notice * appears in all copies. * * Of course, this soft is provided "as is" without express or implied * warranty of any kind. * * * Modified with german comments and some information about collisions. * (Ralf Mieke, ralf@miekenet.de, http://mieke.home.pages.de) * French translation: Serge François, serge@selfhtml.org, http://fr.selfhtml.org */ function array(n) { for(i=0;i<n;i++) this[i]=0; this.length=n; } /* Quelques fonctions fondamentales doivent être transformées à cause * d'erreurs Javascript. * Essayez par exemple de calculer 0xffffffff >> 4 ... * Les fonctions utilisées maintenant sont il est vrai plus lentes que les * fonctions originales mais elles fonctionnent. */ function integer(n) { return n%(0xffffffff+1); } function shr(a,b) { a=integer(a); b=integer(b); if (a-0x80000000>=0) { a=a%0x80000000; a>>=b; a+=0x40000000>>(b-1); } else a>>=b; return a; } function shl1(a) { a=a%0x80000000; if (a&0x40000000==0x40000000) { a-=0x40000000; a*=2; a+=0x80000000; } else a*=2; return a; } function shl(a,b) { a=integer(a); b=integer(b); for (var i=0;i<b;i++) a=shl1(a); return a; } function and(a,b) { a=integer(a); b=integer(b); var t1=(a-0x80000000); var t2=(b-0x80000000); if (t1>=0) if (t2>=0) return ((t1&t2)+0x80000000); else return (t1&b); else if (t2>=0) return (a&t2); else return (a&b); } function or(a,b) { a=integer(a); b=integer(b); var t1=(a-0x80000000); var t2=(b-0x80000000); if (t1>=0) if (t2>=0) return ((t1|t2)+0x80000000); else return ((t1|b)+0x80000000); else if (t2>=0) return ((a|t2)+0x80000000); else return (a|b); } function xor(a,b) { a=integer(a); b=integer(b); var t1=(a-0x80000000); var t2=(b-0x80000000); if (t1>=0) if (t2>=0) return (t1^t2); else return ((t1^b)+0x80000000); else if (t2>=0) return ((a^t2)+0x80000000); else return (a^b); } function not(a) { a=integer(a); return (0xffffffff-a); } /* Début de l'algorithme */ var state = new array(4); var count = new array(2); count[0] = 0; count[1] = 0; var buffer = new array(64); var transformBuffer = new array(16); var digestBits = new array(16); var S11 = 7; var S12 = 12; var S13 = 17; var S14 = 22; var S21 = 5; var S22 = 9; var S23 = 14; var S24 = 20; var S31 = 4; var S32 = 11; var S33 = 16; var S34 = 23; var S41 = 6; var S42 = 10; var S43 = 15; var S44 = 21; function F(x,y,z) { return or(and(x,y),and(not(x),z)); } function G(x,y,z) { return or(and(x,z),and(y,not(z))); } function H(x,y,z) { return xor(xor(x,y),z); } function I(x,y,z) { return xor(y ,or(x , not(z))); } function rotateLeft(a,n) { return or(shl(a, n),(shr(a,(32 - n)))); } function FF(a,b,c,d,x,s,ac) { a = a+F(b, c, d) + x + ac; a = rotateLeft(a, s); a = a+b; return a; } function GG(a,b,c,d,x,s,ac) { a = a+G(b, c, d) +x + ac; a = rotateLeft(a, s); a = a+b; return a; } function HH(a,b,c,d,x,s,ac) { a = a+H(b, c, d) + x + ac; a = rotateLeft(a, s); a = a+b; return a; } function II(a,b,c,d,x,s,ac) { a = a+I(b, c, d) + x + ac; a = rotateLeft(a, s); a = a+b; return a; } function transform(buf,offset) { var a=0, b=0, c=0, d=0; var x = transformBuffer; a = state[0]; b = state[1]; c = state[2]; d = state[3]; for (i = 0; i < 16; i++) { x[i] = and(buf[i*4+offset],0xff); for (j = 1; j < 4; j++) { x[i]+=shl(and(buf[i*4+j+offset] ,0xff), j * 8); } } /* tour 1 */ a = FF ( a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */ d = FF ( d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */ c = FF ( c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */ b = FF ( b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */ a = FF ( a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */ d = FF ( d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */ c = FF ( c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */ b = FF ( b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */ a = FF ( a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */ d = FF ( d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */ c = FF ( c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */ b = FF ( b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */ a = FF ( a, b, c, d, x[12], S11, 0x6b901122); /* 13 */ d = FF ( d, a, b, c, x[13], S12, 0xfd987193); /* 14 */ c = FF ( c, d, a, b, x[14], S13, 0xa679438e); /* 15 */ b = FF ( b, c, d, a, x[15], S14, 0x49b40821); /* 16 */ /* tour 2 */ a = GG ( a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */ d = GG ( d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */ c = GG ( c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */ b = GG ( b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */ a = GG ( a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */ d = GG ( d, a, b, c, x[10], S22, 0x2441453); /* 22 */ c = GG ( c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */ b = GG ( b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */ a = GG ( a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */ d = GG ( d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */ c = GG ( c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */ b = GG ( b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */ a = GG ( a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */ d = GG ( d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */ c = GG ( c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */ b = GG ( b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */ /* tour 3 */ a = HH ( a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */ d = HH ( d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */ c = HH ( c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */ b = HH ( b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */ a = HH ( a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */ d = HH ( d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */ c = HH ( c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */ b = HH ( b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */ a = HH ( a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */ d = HH ( d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */ c = HH ( c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */ b = HH ( b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */ a = HH ( a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */ d = HH ( d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */ c = HH ( c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */ b = HH ( b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */ /* tour 4 */ a = II ( a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */ d = II ( d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */ c = II ( c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */ b = II ( b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */ a = II ( a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */ d = II ( d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */ c = II ( c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */ b = II ( b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */ a = II ( a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */ d = II ( d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */ c = II ( c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */ b = II ( b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */ a = II ( a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */ d = II ( d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */ c = II ( c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */ b = II ( b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */ state[0] +=a; state[1] +=b; state[2] +=c; state[3] +=d; } /* Avec l'initialisation de Dobbertin: state[0] = 0x12ac2375; state[1] = 0x3b341042; state[2] = 0x5f62b97c; state[3] = 0x4ba763ed; s'il y a une collision: */ function init() { count[0]=count[1] = 0; state[0] = 0x67452301; state[1] = 0xefcdab89; state[2] = 0x98badcfe; state[3] = 0x10325476; for (i = 0; i < digestBits.length; i++) digestBits[i] = 0; } function update(b) { var index,i; index = and(shr(count[0],3) , 0x3f); if (count[0]<0xffffffff-7) count[0] += 8; else { count[1]++; count[0]-=0xffffffff+1; count[0]+=8; } buffer[index] = and(b,0xff); if (index >= 63) { transform(buffer, 0); } } function finish() { var bits = new array(8); var padding; var i=0, index=0, padLen=0; for (i = 0; i < 4; i++) { bits[i] = and(shr(count[0],(i * 8)), 0xff); } for (i = 0; i < 4; i++) { bits[i+4]=and(shr(count[1],(i * 8)), 0xff); } index = and(shr(count[0], 3) ,0x3f); padLen = (index < 56) ? (56 - index) : (120 - index); padding = new array(64); padding[0] = 0x80; for (i=0;i<padLen;i++) update(padding[i]); for (i=0;i<8;i++) update(bits[i]); for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { digestBits[i*4+j] = and(shr(state[i], (j * 8)) , 0xff); } } } /* Fin de l'algorithme MD5 */ function hexa(n) { var hexa_h = "0123456789abcdef"; var hexa_c=""; var hexa_m=n; for (hexa_i=0;hexa_i<8;hexa_i++) { hexa_c=hexa_h.charAt(Math.abs(hexa_m)%16)+hexa_c; hexa_m=Math.floor(hexa_m/16); } return hexa_c; } var ascii="01234567890123456789012345678901" + " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ"+ "[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"; function MD5(message) { var l,s,k,ka,kb,kc,kd; init(); for (k=0;k<message.length;k++) { l=message.charAt(k); update(ascii.lastIndexOf(l)); } finish(); ka=kb=kc=kd=0; for (i=0;i<4;i++) ka+=shl(digestBits[15-i], (i*8)); for (i=4;i<8;i++) kb+=shl(digestBits[15-i], ((i-4)*8)); for (i=8;i<12;i++) kc+=shl(digestBits[15-i], ((i-8)*8)); for (i=12;i<16;i++) kd+=shl(digestBits[15-i], ((i-12)*8)); s=hexa(kd)+hexa(kc)+hexa(kb)+hexa(ka); return s; } |
|
|
|
#4 (permalink) |
|
Messages: n/a
Hébergeur: |
Patrick Mevzek a écrit :
> http://actuel.fr.selfhtml.org/articl.../md5/index.htm À noter que, hacher le mot de passe avec md5 depuis le client est furieusement inutile. Au contraire, ça enlève une difficulté pour pirater un compte. -- Mickaël Wolff aka Lupus Michaelis http://lupusmic.org |
|
|
|
#5 (permalink) |
|
Messages: n/a
Hébergeur: |
Mickaël Wolff a exposé le 03/09/2007 :
> Patrick Mevzek a écrit : > >> http://actuel.fr.selfhtml.org/articl.../md5/index.htm > > À noter que, hacher le mot de passe avec md5 depuis le client est > furieusement inutile. Au contraire, ça enlève une difficulté pour > pirater un compte. Comment ça ? Si on hache juste le mot de passe je veux bien croire que ça ne serve pas à grand chose, mais si on fais un MD5(passe+clé), avec 'clé' qui est une donnée aléatoire changeant à chaque affichage du formulaire, là ça devient plus dur à cracker, puisque chaque appel au formulaire devient unique et non reproductible ... non ? -- Olivier Ligny www.virgal.net (Monde persistant) |
|
|
|
#6 (permalink) |
|
Messages: n/a
Hébergeur: |
O.L. a écrit :
> Comment ça ? > > Si on hache juste le mot de passe je veux bien croire que ça ne serve > pas à grand chose, mais si on fais un MD5(passe+clé), avec 'clé' qui est > une donnée aléatoire changeant à chaque affichage du formulaire, là ça > devient plus dur à cracker, puisque chaque appel au formulaire devient > unique et non reproductible ... non ? > Et comment cette clé est transmise ? Le seul moyen d'obtenir un traitement sécurisé de l'authentification, c'est de passer par le chiffrement de la communication (SSL par exemple). Les autres méthodes sont des bricolages tentant d'être plus malin qu'un pirate. Ce qui est peine perdue. Mais ce n'est que mon opinion. -- Mickaël Wolff aka Lupus Michaelis http://lupusmic.org |
|
|
|
#7 (permalink) |
|
Messages: n/a
Hébergeur: |
Thierry Loiseau a écrit :
> En copie ci-dessous le script : Au secours, j'ai cru avoir une ènième attaque cardiaque en lisant ça... C'est bourré de variables globales et de fonctions toutes bizarres, etc. Mériterait une grosse refonte tout ça. > * Javascript implementation of the RSA Data Security, Inc. MD5 > * Message-Digest Algorithm. > * > * Copyright (c) 1996 Henri Torgemane. All Rights Reserved. Euhhh, c'est copyrightable l'implémentation d'un algorithme ? > * Permission to use, copy, modify, and distribute this software > * and its documentation for any purposes and without > * fee is hereby granted provided that this copyright notice > * appears in all copies. Ah non, pas de refonte, me saoulent tous avec leur "copyright notice provided in all copies". Pfff. > function array(n) { > for(i=0;i<n;i++) this[i]=0; > this.length=n; > } Ca semble bizarre a personne ça ? Pourquoi ne pas utiliser Array tout simplement ? Me parait obsolète ce code, non ? Tout du moins vieillissant alors. > /* Quelques fonctions fondamentales doivent être transformées à cause > * d'erreurs Javascript. > * Essayez par exemple de calculer 0xffffffff >> 4 ... > * Les fonctions utilisées maintenant sont il est vrai plus lentes que > * les fonctions originales mais elles fonctionnent. > */ Suis nul en math, c'est supposé faire quoi 0xffffffff >> 4 ? Tous mes navigateurs me disent -1, ils se trompent ? > function integer(n) { return n%(0xffffffff+1); } J'imagine que cette méthode est due au commentaire précédent, mais euh si 0xffffffff >> 4 ça fait bien -1, dans ce cas un bon vieux parseInt(n,10) suffira je pense. Est-ce que quelqu'un pourrait m'éclairer svp ? merci. > function shr(a,b) { > a=integer(a); > b=integer(b); > if (a-0x80000000>=0) { > a=a%0x80000000; > a>>=b; > a+=0x40000000>>(b-1); > } else > a>>=b; > return a; > } Que c'est laid, mais que c'est laid ces ouvertures de {} que quand ça lui chante. Enfin bref le langage autorise cette "erreur", tant pis j'arrête de regarder maintenant, ça me fait trop mal aux yeux ![]() Dire que c'est des humains qui pondent des trucs pareils, ça me fait froid dans le dos... -- laurent |
|
|
|
#8 (permalink) |
|
Messages: n/a
Hébergeur: |
Mickaël Wolff a écrit :
> O.L. a écrit : >> Si on hache juste le mot de passe je veux bien croire que ça ne serve >> pas à grand chose, mais si on fais un MD5(passe+clé), avec 'clé' qui est >> une donnée aléatoire changeant à chaque affichage du formulaire, là ça >> devient plus dur à cracker, puisque chaque appel au formulaire devient >> unique et non reproductible ... non ? > > Et comment cette clé est transmise ? Lol elle est là l'astuce Ce sera nettement plus difficile à "cracker" ![]() -- laurent |
|
![]() |
| Outils de la discussion | |
|
|