2010-07-19 57 views
1

我需要在POST中向服務器發送電子郵件(字符串)和密碼(字節[]中的MD5哈希)。使用HTTP發佈黑莓MD5身份驗證

下面我如何得到我的MD5哈希值,其中 「密碼」 是一個String(用戶輸入的內容):

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

而且功能:

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; 
} 

所以 「passMD5」 應該是一個我的字符串值「密碼」的字節MD5哈希,對不對?

然後我需要通過HTTP POST將信息發送到URL並讀取結果(XML)。看到代碼的其餘部分如下:

readURL(urlTemplate, email, passMD5); 

哪裏urlTemplate就像是「http://www.domain.com/myfile.aspx?action=login&enc=1」的字符串,通過電子郵件發送字符串及密碼以字節爲單位的MD5哈希值。

以下readURL:

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); 
    } 
} 

所以現在在爲了轉換爲字符串密碼的MD散列添加到data.append()函數只需要字符串參數... 我想是因爲這個原因,我不發送良好的MD5哈希值,它會造成問題。

在ASP.NET中C#服務器端,我有這樣的:

byte[] PasswordHash; 

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

所以,當我問這個URL 「http://www.domain.com/myfile.aspx?action=login&enc=0」,並授予密碼AS IS(所以字符串,而不是一個byte []而不是MD5哈希),並做

data.append("pass", password); 

然後它的工作。

我只是有創建我的MD5哈希或與HTTP POST或兩者的問題... 請幫助我!

+0

在encodeStringMD5嘗試使字節[]進入BigInteger,然後使用toString(16) – Steve 2012-06-01 12:31:57

回答

-1

你不能只在一個字節[]上調用「toString()」,並期望得到一個有意義的結果。如果你想將它轉換爲字節的十六進制表示,你需要一個方法來做到這一點。我建議回到你之前的問題Blackberry encode MD5 different from MD5 in C#,因爲你有一個函數在那裏做了從byte []到String的對話。

+0

是的,我知道。這只是一個嘗試。所以我現在使用這個:byte [] bytes = s.getBytes(「UTF-16LE」);以正確的格式(與C#相同)轉換,並將byte []傳遞給我的函數private static String convertToHex(byte [] data)。然後通過POST將其發送到服務器。快樂的消息,我得到了和我的數據庫一樣的東西!下面是我從黑莓獲得的內容:09c09e5b52580e477514fa ..........和數據庫:0x09C09E5B52580E477514FA ..........在我的數據庫中只有一個0x前面。你知道爲什麼嗎? – Dachmt 2010-07-20 00:08:25

+0

無論如何,問題出在服務器端。我有一個字符串是用UTF-16LE編碼的MD5哈希,我想要的是相同的,但在字節[]中。所以當我做PasswordHash = Encoding.Unicode.GetBytes(Password);它改變我的結果,所以它不工作......我需要有一個字符數組與我的字符串的值。我在這裏迷失了 – Dachmt 2010-07-20 00:42:57

+1

解決方案解決了。以UTF-16LE對結果進行編碼並獲得良好結果後,我需要僅以字節爲單位轉換我的十六進制字符串。我在http://www.nathanm找到了一個有用的鏈接。COM/CSHARP - 轉換 - 十六進制字符串tofrom字節數組快速/發表評論頁面-1 /#評論-147669。 所以我做了:PasswordHash = HexStringToByteArray(Password);我終於成功了我想要的東西!謝謝 – Dachmt 2010-07-20 17:41:31