使用HTTP Post进行Blackberry MD5身份验证

时间:2010-07-19 20:28:58

标签: blackberry hash md5 http-post

我需要在POST中向服务器发送电子邮件(String)和密码(byte []中的MD5哈希)。

下面我如何得到我的MD5哈希,其中“password”是一个字符串(用户输入的内容):

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”应该是我的字符串值“password”的字节的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哈希值转换为String,以便添加到只接受String参数的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或两者的问题...... 请帮帮我!

1 个答案:

答案 0 :(得分:-1)

你不能只在字节[]上调用“toString()”并期望获得有意义的结果。如果要将其转换为字节的十六进制表示,则需要一种方法来执行此操作。我建议回到Blackberry encode MD5 different from MD5 in C#上的上一个问题,因为那里有一个函数可以执行从byte []到String的转换。