MD5

Le
loiseauthierry
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Patrick Mevzek
Le #753671
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/articles/javascript/md5/index.htm

(premier lien en mettant javascript et MD5 dans Google)

--
Patrick Mevzek . . . . . . . . . . . . . . Dot and Co
Dépêches sur le nommage
loiseauthierry
Le #753670
Patrick Mevzek
Vous avez une piste ?


http://actuel.fr.selfhtml.org/articles/javascript/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, , http://mieke.home.pages.de)
* French translation: Serge François, ,
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:

begin 644 Message1
M7MH=JO6_>MG!X?!51$)W,CXV!A"=(!AR71,<X`Y-IIT9^Z&8L$2N'Y*Y:R.;
39GIK9>TF$W()/MEHR%C4:G1R:Q" `
end

begin 644 Message2
M7MH=JO6_>MG!X?!51$)W,CXV!A"=(!AR71,<X`Y-IIT9^Z&8L$2N'Y*Y:R.;
39GIK9>TF$W()/MEHREC4:G1R:Q" `
end
*/
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;i<16;i++) kd+=shl(digestBits[15-i], ((i-12)*8));
s=hexa(kd)+hexa(kc)+hexa(kb)+hexa(ka);
return s;
}


Mickaël Wolff
Le #753669

http://actuel.fr.selfhtml.org/articles/javascript/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

O.L.
Le #753363
Mickaël Wolff a exposé le 03/09/2007 :

http://actuel.fr.selfhtml.org/articles/javascript/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)


Mickaël Wolff
Le #753362

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

Laurent vilday
Le #752676
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

Laurent vilday
Le #752675
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" :D

--
laurent


Mickaël Wolff
Le #752334

Lol elle est là l'astuce :) Ce sera nettement plus difficile à "cracker" :D


Non. Je un peu pénible. Donc compliquer le processus
d'authentification et y passer de trop nombreuses minutes pour espérer
décourager un éventuel être malveillant... c'est... soyons gentil...
sans intérêt.

Mais ce n'est que mon avis, et j'en resterais là.

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org

Laurent vilday
Le #752333

Lol elle est là l'astuce :) Ce sera nettement plus difficile à "cracker" :D


Non. Je un peu pénible.


Quoi quoi quoi ?

Tu peux me la refaire en français STP, j'avoue ne rien avoir compris.

Donc compliquer le processus
[cut]


Oui et alors ? Tu l'as déjà dit et j'ai *jamais* dit le contraire,
j'allais même dans ton sens, si si. Mais bon, tout le contexte ayant été
supprimé de ton message c'est plus difficile de s'en rendre compte.

Bon, force est de constater que l'humour léger de mon post n'a pas percé
la barrière de mon ordinateur. Tant pis un coup dans l'eau, j'essaierai
d'être plus accessible la prochaine fois.

--
laurent


Olivier Miakinen
Le #752331

[...]

* Copyright (c) 1996


[...]

Me parait obsolète ce code, non ? Tout du moins
vieillissant alors.


Ça ne serait pas fait pour me surprendre.


Publicité
Poster une réponse
Anonyme