2010-07-19 4 views
1

Je dois envoyer à un serveur dans POST un email (String) et un mot de passe (hash MD5 en byte []).Authentification Blackberry MD5 avec HTTP Post

Voici comment je reçois mon hachage MD5 où "mot de passe" est une chaîne (ce que l'entrez utilisateur):

byte[] passMD5 = Crypto.encodeStringMD5(password); 

Et la fonction:

public static byte[] 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 md5; 
} 

Alors "passMD5" devrait être un MD5 hacher en octets de ma valeur de chaîne "mot de passe", non?

Ensuite, j'ai besoin d'envoyer les informations via HTTP POST à ​​une URL et lire le résultat (XML). Voir ci-dessous le reste du code:

readURL(urlTemplate, email, passMD5); 

Où urlTemplate est une chaîne comme « http://www.domain.com/myfile.aspx?action=login&enc=1 », e-mail et mot de passe d'une chaîne le hachage MD5 en octets.

Le readURL ci-dessous:

private void readURL(String url, String email, byte[] pass) throws IOException { 
    HttpConnection conn = null; 
    InputStream in = null; 
    OutputStream os = null; 
    byte dataBytes[]; 

    try { 
     URLEncodedPostData data = new URLEncodedPostData(URLEncodedPostData.DEFAULT_CHARSET, false); 
     data.append("email", email); 
     data.append("pass", pass.toString()); 

     dataBytes = data.getBytes(); 

     conn = (HttpConnection) Connector.open(url, Connector.READ_WRITE); 
     conn.setRequestMethod(HttpConnection.POST); 
     conn.setRequestProperty("Content-Type", data.getContentType()); 
     conn.setRequestProperty("Content-Length", Integer.toString(dataBytes.length)); 

     os = conn.openOutputStream(); 
     os.write(dataBytes); 
     os.flush(); 
     os.close(); 

     in = conn.openInputStream(); 
     verifyLogin(getLoginContent(in)); 
    } catch (IOException e) { 

    } catch (IllegalArgumentException e) { 

    } finally { 
     ConnectionUtil.close(conn, in); 
     ConnectionUtil.close(conn, os); 
    } 
} 

Donc maintenant le hachage MD du mot de passe transformé en chaîne afin d'être ajouté à la fonction data.append() qui ne prend paramètres de chaîne ... Je pense que pour cette raison, je n'envoie pas le bon hachage MD5 et cela pose problème.

Du côté du serveur dans ASP.NET C#, j'ai ceci:

byte[] PasswordHash; 

if (enc == 0) { 
    MD5 MD5Hasher = MD5.Create(); 
    PasswordHash = MD5Hasher.ComputeHash(Encoding.Unicode.GetBytes(Password)); 
} else { 
    PasswordHash = Encoding.Unicode.GetBytes(Password); 
} 

Alors, quand je demande à cette adresse « http://www.domain.com/myfile.aspx?action=login&enc=0 » et donner le mot de passe en l'état (donc une chaîne, pas un octet [] et pas hachage MD5) et faire

data.append("pass", password); 

puis cela fonctionne.

Je viens d'avoir un problème avec la création de mon hachage MD5 ou avec le HTTP POST ou les deux ... S'il vous plaît, aidez-moi!

+0

Dans encodeStringMD5, essayez de transformer l'octet [] en BigInteger, puis d'utiliser toString (16) – Steve

Répondre

-1

Vous ne pouvez pas simplement appeler "toString()" sur un octet [] et espérer obtenir un résultat significatif. Si vous voulez le convertir en une représentation hexadécimale des octets, vous avez besoin d'une méthode pour le faire. Je suggère de revenir à votre question précédente au Blackberry encode MD5 different from MD5 in C# depuis que vous avez eu une fonction là qui a fait la conversation de byte [] à String.

+0

Oui, je sais. C'était juste un essai. Donc j'utilise maintenant ceci: byte [] bytes = s.getBytes ("UTF-16LE"); convertir au format correct (le même que le C#), et passer le byte [] à ma fonction private static String convertToHex (byte [] data). Ensuite, envoyez-le au serveur via POST. Bonne nouvelle, j'ai la même chose que dans ma base de données! Voici ce que je reçois de la blackberry: 09c09e5b52580e477514fa .........., et de la base de données: 0x09C09E5B52580E477514FA .......... Il y a juste le 0x en face de celui de ma base de données . Est-ce que tu sais pourquoi? – Dachmt

+0

De toute façon, le problème est sur le côté serveur. J'ai une chaîne qui est le hachage MD5 encodé en UTF-16LE, et je veux la même chose mais en byte []. Donc, quand je fais PasswordHash = Encoding.Unicode.GetBytes (mot de passe); ça change mon résultat et ça ne marche pas ... J'ai besoin d'un tableau d'octets avec la valeur de ma chaîne. Je suis un peu perdu ici – Dachmt

+1

Solution résolue. Après avoir codé le résultat en UTF-16LE et avoir le bon résultat, j'ai dû transformer ma chaîne hexadécimale en octets seulement. J'ai trouvé un lien utile avec la fonction à http: //www.nathanm.com/csharp-convert-hex-chaîne-tofrom-octet-tableau-rapide/commentaire-page-1/# comment-147669. Donc j'ai fait: PasswordHash = HexStringToByteArray (mot de passe); et j'ai finalement réussi ce que je voulais! Merci – Dachmt