【问题标题】:Blackberry MD5 authentication with HTTP Post使用 HTTP Post 进行黑莓 MD5 身份验证
【发布时间】:2010-07-19 20:28:57
【问题描述】:

我需要通过 POST 向服务器发送电子邮件(字符串)和密码(字节 [] 中的 MD5 哈希)。

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

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”这样的字符串,通过电子邮件发送字符串并以字节为单位为 MD​​5 散列密码。

下面的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”并按原样提供密码(所以是字符串,而不是字节 [] 而不是 MD5 哈希)并执行时

data.append("pass", password);

然后就可以了。

我只是在创建 MD5 哈希或 HTTP POST 或两者都有问题... 请帮帮我!

【问题讨论】:

  • 在 encodeStringMD5 中尝试将 byte[] 变成 BigInteger,然后使用 toString(16)

标签: blackberry hash md5 http-post


【解决方案1】:

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

【讨论】:

  • 是的,我知道。这只是一次尝试。所以我现在使用这个: byte[] bytes = s.getBytes("UTF-16LE");以正确的格式进行转换(与 C# 相同),并将 byte[] 传递给我的函数 private static String convertToHex(byte[] data)。然后通过 POST 将其发送到服务器。好消息,我得到了和我的数据库一样的结果!这是我从黑莓中得到的:09c09e5b52580e477514fa ..........,从数据库中得到:0x09C09E5B52580E477514FA ..........我的数据库中只有一个前面的 0x .你知道为什么吗?
  • 反正问题出在服务器端。我有一个字符串,它是以 UTF-16LE 编码的 MD5 哈希,我想要相同但在 byte[] 中。所以当我做 PasswordHash = Encoding.Unicode.GetBytes(Password);它改变了我的结果,所以它不起作用......我需要一个带有我的字符串值的字节数组。我有点迷路了
  • 解决方案已解决。在将结果编码为 UTF-16LE 并获得良好结果后,我只需要将我的十六进制字符串转换为字节。我在nathanm.com/csharp-convert-hex-string-tofrom-byte-array-fast/… 找到了一个有用的函数链接。所以我做了: PasswordHash = HexStringToByteArray(Password);我终于成功了我想要的!谢谢
猜你喜欢
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 2016-05-11
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多