2010-07-19 2 views
1

Мне нужно отправить серверу в POST письмо (String) и пароль (хеш MD5 в байте []).Проверка подлинности Blackberry MD5 с HTTP-сообщением

Ниже, как я получу свой 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(), которая только принимает параметры типа String ... Я думаю, из-за этого я не посылаю хороший хеш 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 (так String, а не байт [] а не хеш MD5) и до

то он работает.

У меня просто проблема с созданием хеша MD5 или с помощью HTTP POST или обоих ... Пожалуйста, помогите мне!

+0

В encodeStringMD5 попробуйте сделать байт [] в BigInteger, а затем использовать toString (16) – Steve

ответ

-1

Вы не можете просто вызвать «toString()» на байт [] и ожидать получения значимого результата. Если вы хотите преобразовать его в шестнадцатеричное представление байтов, вам нужен способ сделать это. Я предлагаю вернуться к вашему предыдущему вопросу в Blackberry encode MD5 different from MD5 in C#, так как у вас была функция там, которая конвертировала с байта [] в String.

+0

Да, я знаю. Это была просто попытка. Поэтому я теперь использую это: byte [] bytes = s.getBytes («UTF-16LE»); конвертировать в правильном формате (то же, что и C# один), и передать байт [] моей функции private static String convertToHex (данные байта []). Затем отправьте его на сервер через POST. Счастливые новости, я получил то же самое, что и в моей базе данных! Вот что я получаю от ежевики: 09c09e5b52580e477514fa .........., и из базы данных: 0x09C09E5B52580E477514FA .......... Существует только 0x перед одним из моего БД , Ты знаешь почему? – Dachmt

+0

В любом случае проблема на стороне сервера. У меня есть строка, которая является хешем MD5, закодированным в UTF-16LE, и я хочу то же самое, но в байте []. Поэтому, когда я делаю PasswordHash = Encoding.Unicode.GetBytes (Пароль); он меняет мой результат и поэтому не работает ... Мне нужно иметь байтовый массив со значением моей String. Я потерял здесь – Dachmt

+1

Решение решено. После кодирования результата в UTF-16LE и хорошего результата мне нужно было преобразовать шестую строку только в байтах. Я нашел полезную ссылку с функцией на http: //www.nathanm.ком/CSharp-новообращенный-гекс-строка-tofrom байт-массив быстро/комментарий-страничный-1/# комментарий-147669. Итак, я сделал: PasswordHash = HexStringToByteArray (Пароль); и я, наконец, добился успеха! благодаря – Dachmt

Смежные вопросы