黑莓编码的MD5与MD5中的MD5不同

时间:2010-07-13 00:18:00

标签: encoding blackberry md5

我的密码在MD5中用C#编码并插入我的数据库中。

MD5 MD5Hasher = MD5.Create();
byte[] PasswordHash = MD5Hasher.ComputeHash(Encoding.Unicode.GetBytes(PasswordText.Value));

PasswordHash按原样插入,例如 0x09C09E5B52580E477514FA ..........

在黑莓应用程序中,我获取密码,想要对其进行编码以将其传递给将比较两个哈希密码的Web服务。问题是我的结果与我在Blackberry应用程序中创建的MD5不同。

password = Crypto.encodeStringMD5(password);

然后在我的功能之下:

    public static String 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 convertToHex(md5);
}

private static String convertToHex(byte[] data) {
    StringBuffer buf = new StringBuffer();
    for (int i = 0; i < data.length; i++) {
        int halfbyte = (data[i] >>> 4) & 0x0F;
        int two_halfs = 0;
        do {
            if ((0 <= halfbyte) && (halfbyte <= 9))
                buf.append((char) ('0' + halfbyte));
            else
                buf.append((char) ('a' + (halfbyte - 10)));
            halfbyte = data[i] & 0x0F;
        } while(two_halfs++ < 1);
    }
    return buf.toString();
}

所以返回的内容如下: 07054da3aea1cc98377fe0 ..........

知道如何在Blackberry中使用我的C#函数创建相同的哈希密码吗?

谢谢!

3 个答案:

答案 0 :(得分:5)

java getBytes()的{​​{1}}方法返回的编码与.NET中的String不同。您需要指定明确的编码算法。对两个平台使用UTF-8,你应该没问题。您还可以尝试为Java端的getBytes方法提供charset名称;试试Encoding.Unicode

答案 1 :(得分:1)

GregS直接回答了你的问题;但另外,我建议不要让客户创建MD5总和。如果服务器管理创建MD5sum,您可以通过在服务器上对密码进行编码之前向密码添加“salt”值来进一步确保密码不能进行逆向工程(例如彩虹表)。如果在客户端上执行此操作,则必须将salt暴露给不太安全的客户端。

答案 2 :(得分:0)

你检查格式吗?许多语言都以不同的格式创建相同的哈希值。

例如:

5f45r5ssfds544g56fd4gfd56g4f6dgf

VS

5f-45-r5-ss-fd-s5-44-g5-6f-d4-gf-d5-6g-4f-6d-gf

转换为字符串时,请尝试检查两种格式。