Encoding Blackberry编码MD5与C中的MD5不同#

Encoding Blackberry编码MD5与C中的MD5不同#,encoding,blackberry,md5,Encoding,Blackberry,Md5,我的密码用C#的MD5编码并插入数据库 MD5 MD5Hasher = MD5.Create(); byte[] PasswordHash = MD5Hasher.ComputeHash(Encoding.Unicode.GetBytes(PasswordText.Value)); 密码哈希按原样插入,看起来像0x09C09E5B5580E477514FA………..例如 在blackberry应用程序中,我获取密码,希望对其进行编码,将其传递给一个web服务,该服务将比较两个哈希密码。问题是我

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

MD5 MD5Hasher = MD5.Create();
byte[] PasswordHash = MD5Hasher.ComputeHash(Encoding.Unicode.GetBytes(PasswordText.Value));
密码哈希按原样插入,看起来像0x09C09E5B5580E477514FA………..例如

在blackberry应用程序中,我获取密码,希望对其进行编码,将其传递给一个web服务,该服务将比较两个哈希密码。问题是我的结果与我在黑莓应用程序中创建的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();
}
publicstaticstringencodestringmd5(字符串s)引发异常{
byte[]bytes=s.getBytes();
MD5Digest=新的MD5Digest();
更新(字节,0,字节,长度);
int length=digest.getDigestLength();
字节[]md5=新字节[长度];
getDigest(md5,0,true);
返回到十六进制(md5);
}
专用静态字符串convertToHex(字节[]数据){
StringBuffer buf=新的StringBuffer();
对于(int i=0;i>>4)&0x0F;
int two_halfs=0;
做{

如果((0The
getBytes()
method of java
String
返回与.NET中的
encoding.Unicode
不同的编码。您需要指定明确的编码算法。在这两种平台上都使用UTF-8,您应该可以。您还可以尝试在java端为getBytes方法提供字符集名称;尝试
getBytes(“UTF-16”)

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

是否检查格式?许多语言创建相同的哈希值,但格式不同

例如:

5f45r5ssfds544g56fd4gfd56g4f6dgf

vs

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


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

我尝试使用byte[]bytes=s.getBytes(“UTF-16BE”);因为Encoding.Unicode返回UTF-16。它进行编码,结果是不同的,但仍然不相同。它看起来是这样的:fba5ca8e004126fbcc108f…………它似乎更好,但在转换为十六进制时可能有问题?在两个程序中都使用UTF-8。我不知道它是否应该是UTF-16LE,或者其中一个程序正在吐出Byte Order Mark。关于MD5编码的问题已被其他人解决。我只想指出,如果您在客户端对密码进行散列,然后将该散列传递给服务器以与数据库中的散列进行比较,则散列已成为密码。如果有人能够访问数据库,他们可以通过p模拟用户向服务器分配它期望看到的哈希值。拥有密码以及使用sault的安全性在于,即使哈希值受到破坏,它也不会公开帐户。客户端必须提供哈希到数据库内容中的文本。