2009-08-06 7 views
4

J'essaie actuellement de modifier une application GWT-Ext existante, qui utilise des mots de passe en texte clair dans sa base de données MySql. Mon plan était d'utiliser les hachages md5, car les mots de passe existants peuvent être facilement modifiés avec la fonction MySql et je m'attendais à trouver une solution facile pour le côté GWT-Ext. Mais comme je l'ai découvert, java.security n'est pas supporté par GWT et il ne semble pas y avoir d'autre implémentation qui puisse être utilisée pour changer la chaîne de mot de passe en un hachage md5 du côté client.hachage md5 pour la chaîne de mot de passe dans GWT/GWT-Ext?

seule « solution » je l'ai trouvé jusqu'à présent, est de nouveau mettre en œuvre une méthode md5 via JSNI comme décrit ici: http://groups.google.com/group/Google-Web-Toolkit/browse_thread/thread/ad09475a9944c9f8

Il existe une extension d'utilisateur existant pour Ext-JS, mais je ne pouvais pas trouver quoi que ce soit pour GWT-Ext: http://extjs.com/forum/showthread.php?p=133516

Est-ce que quelqu'un connaît un moyen plus élégant/simple pour résoudre ce problème? Peut-être que je devrais utiliser quelque chose d'autre au lieu de md5 pour m'assurer que les mots de passe sont cryptés?

Vive Frank

Répondre

9

Personnellement, je dirais que vous faites mal. Je ne voudrais pas hacher un mot de passe du côté du client (ce qui est ce que GWT est). Si vous hachez votre mot de passe, vous voudrez sans doute le saler, sinon vous serez vulnérable aux attaques rainbow. Si vous le hachez + le sel du côté client, votre sel sera accessible à vos utilisateurs.

Si j'étais vous, je voudrais hacher + votre mot de passe du côté du serveur. Cela vous permettra d'utiliser votre code Java standard pour effectuer votre hachage MD5.

Mes 2 cents.

-JP

+0

Ce n'est pas une mauvaise idée s'il fait quelque chose comme cram-md5 côté client, où le client calcule un hmac (md5 hash plus un nonce sel) et l'envoie au serveur. L'inconvénient est que le serveur a besoin d'un mot de passe en clair pour vérifier le hmac. –

+0

bon point sur les attaques arc-en-ciel, ne savait pas à ce sujet avant. Je l'ai également résolu en faisant le cryptage côté serveur, mais l'idée était, que je voulais crypter le mot de passe, avant de l'envoyer au serveur, car nous utilisons actuellement seulement http et non https. – FrankS

+0

GWT est côté client et côté serveur. A part ça, le post est un bon conseil. Ne pas le hacher du côté client. Jetez un oeil à http://www.owasp.org/index.php/Hashing_Java. –

6

Une autre idée qui peut répondre à vos besoins est ce qu'on appelle la connaissance nulle auth. En règle générale, lors de la définition du mot de passe initial, le client hache le mot de passe de l'utilisateur N fois (où N est un nombre grand comme 1000), puis envoie le mot de passe initial de l'utilisateur. Ce hachage final au serveur avec N. Le serveur stocke le hachage et N.

Plus tard, lorsque l'utilisateur veut s'authentifier, le serveur indique au client N-1, et le client hache le mot de passe que l'utilisateur tape N -1 fois et l'envoie au serveur. Le serveur fait 1 hachage de plus sur le hachage reçu, et (espérons-le) obtient le hachage stocké. Le serveur stocke ensuite le hachage N-1 et le numéro N-1.

Chaque fois que l'utilisateur s'authentifie, le serveur décrémente le N stocké et enregistre le hachage précédent.

Lorsque N descend à 0, l'utilisateur doit choisir et définir un nouveau mot de passe.

Le serveur doit s'assurer qu'il ne demande jamais la même itération, sinon il est vulnérable à une relecture. Vous ne pouvez pas vraiment appliquer cette condition du côté du client car le client (en particulier un navigateur) ne peut pas garder la trace du dernier N.

+0

Idée très intéressante, et jamais pensé à cela avant. Ne correspond pas vraiment à la solution actuelle, mais je vais le garder à l'esprit pour référence future, merci :-) – FrankS

+1

Idée intéressante donc j'ai passé du temps à y penser, mais il est vulnérable à un homme-dans-le-milieu attaque. Lors d'une demande d'authentification, le serveur envoie un certain nombre de M. L'attaquant envoie (M-1) au client et reçoit le hachage (M-1). L'attaquant tente de s'authentifier à nouveau, reçoit le défi (M-1) du serveur et répond avec le hachage (M-1). L'attaquant est maintenant authentifié. – rix0rrr

+0

oui, cela ressemble à un problème. Ma première pensée serait d'obliger le serveur à ne pas réutiliser M après l'avoir émis lors d'un challenge au client. Cependant, le plus gros problème reste que Mallory pourrait dire au client M-100, collecter le hachage (M-100) du client, puis se connecter jusqu'à 100 fois avec le hachage intercepté. Je vais devoir aller voir si le projet que j'ai rencontré pour la première fois a trouvé les mêmes problèmes et traité avec lui ou a abandonné l'autorisation de connaissance zéro. –

2

Vous pouvez utiliser gwt-crypto pour générer SHA-1 hash sur le côté client à l'aide:

String getSHA1for(String text) { 
    SHA1Digest sd = new SHA1Digest(); 
    byte[] bs = text.getBytes(); 
    sd.update(bs, 0, bs.length); 
    byte[] result = new byte[20]; 
    sd.doFinal(result, 0); 
    return byteArrayToHexString(result); 
} 

String byteArrayToHexString(final byte[] b) { 
    final StringBuffer sb = new StringBuffer(b.length * 2); 
    for (int i = 0, len = b.length; i < len; i++) { 
    int v = b[i] & 0xff; 
    if (v < 16) sb.append('0'); 
    sb.append(Integer.toHexString(v)); 
    } 
    return sb.toString(); 
} 
Questions connexes