2010-07-13 4 views
2

J'ai mes mots de passe codés en MD5 en C# et inséré dans ma base de données.Blackberry encoder MD5 différent de MD5 en C#

MD5 MD5Hasher = MD5.Create(); 
byte[] PasswordHash = MD5Hasher.ComputeHash(Encoding.Unicode.GetBytes(PasswordText.Value)); 

PasswordHash est inséré tel quel et ressemble 0x09C09E5B52580E477514FA .......... par exemple.

Dans l'application blackberry, j'obtiens le mot de passe, je veux l'encoder pour le passer à un service Web qui va comparer les deux mots de passe hachés. Le problème est mon résultat est différent du MD5 que je crée dans mon application Blackberry.

password = Crypto.encodeStringMD5(password); 

Puis ci-dessous ma fonction:

public static String encodeStringMD5(String s) throws Exception { 
    byte[] bytes = s.getBytes(); 
    MD5Digest digest = new MD5Digest(); 
    digest.update(bytes, 0, bytes.length); 
    int length = digest.getDigestLength(); 
    byte[] md5 = new byte[length]; 
    digest.getDigest(md5, 0, true); 
    return convertToHex(md5); 
} 

private static String convertToHex(byte[] data) { 
    StringBuffer buf = new StringBuffer(); 
    for (int i = 0; i < data.length; i++) { 
     int halfbyte = (data[i] >>> 4) & 0x0F; 
     int two_halfs = 0; 
     do { 
      if ((0 <= halfbyte) && (halfbyte <= 9)) 
       buf.append((char) ('0' + halfbyte)); 
      else 
       buf.append((char) ('a' + (halfbyte - 10))); 
      halfbyte = data[i] & 0x0F; 
     } while(two_halfs++ < 1); 
    } 
    return buf.toString(); 
} 

Il retourne quelque chose comme ceci: 07054da3aea1cc98377fe0 ..........

Toute idée comment je peux obtenir la même mot de passe hashed que je crée avec ma fonction C# dans le Blackberry?

Merci!

+1

Les problèmes concernant le codage MD5 ont été résolus par d'autres. Je voudrais juste souligner que si vous êtes en train de hacher le mot de passe sur le client, puis en passant ce hachage au serveur pour le comparer avec le hachage dans la base de données, alors le hachage est devenu le mot de passe. Si quelqu'un est capable d'accéder à la base de données, il peut usurper l'identité d'un utilisateur en transmettant au serveur le hachage qu'il s'attend à voir. La sécurité d'avoir le mot de passe, et en effet d'utiliser un sault, est que même si le hachage est compromis, il n'expose pas le compte. Un clinet doit fournir le texte qui se cache dans le contenu de la base de données. – Richard

Répondre

5

La méthode getBytes() de Java String renvoie un codage différent de Encoding.Unicode dans .NET. Vous devez spécifier des algorithmes de codage non ambigus. Utilisez UTF-8 pour les deux plates-formes et vous devriez aller bien. Vous pouvez également essayer de fournir un nom de jeu de caractères à la méthode getBytes du côté Java; essayer getBytes("UTF-16")

+0

J'ai essayé d'utiliser byte [] bytes = s.getBytes ("UTF-16BE"); car Encoding.Unicode renvoie UTF-16. Il code, le résultat est différent mais toujours pas le même. Il ressemble à ceci: fba5ca8e004126fbcc108f .......... Il semble être mieux, mais probablement un problème lors de la conversion en hexadécimal? – Dachmt

+0

Utilisez simplement UTF-8 dans les deux programmes. Je ne sais pas si ça devrait être UTF-16LE, ou peut-être que l'un d'entre eux crache le Byte Order Mark. –

1

GregS a répondu à votre question directement; mais en passant, je recommanderais de ne pas avoir le client créer la somme MD5. Si le serveur gère la création du MD5sum, vous pouvez en outre vous assurer que le mot de passe ne peut pas être modifié (table rainbow, par exemple) en ajoutant une valeur "salt" au mot de passe avant de l'encoder sur le serveur. Si vous faites cela sur le client, vous devez exposer le sel au client qui est moins sécurisé.

0

Vérifiez-vous le format? De nombreuses langues créent les mêmes hachages mais dans des formats différents.

Par exemple:

5f45r5ssfds544g56fd4gfd56g4f6dgf

contre

5f-45-r5-ss-fd-s5-44-g5-6f-d4-gf-d5-6g-4f-6d-gf

Essayez de vérifier pour les deux formats lors de la conversion en une chaîne.