Blackberry кодировать MD5 отличается от MD5 в C # - PullRequest
2 голосов
/ 13 июля 2010

Мои пароли зашифрованы в MD5 на C # и вставлены в мою БД.

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

PasswordHash вставлен как есть и выглядит как 0x09C09E5B52580E477514FA .......... *Например, 1005 *.

В приложении blackberry я получаю пароль, хочу закодировать его, чтобы передать его веб-службе, которая будет сравнивать оба хешированных пароля.Проблема в том, что мой результат отличается от MD5, который я создаю в своем приложении Blackberry.

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 ..........

Есть идеи, как получить тот же хешированный пароль, который я создаю с помощью своей функции C # в Blackberry?

Спасибо!

Ответы [ 3 ]

5 голосов
/ 13 июля 2010

Метод getBytes() в java String возвращает кодировку, отличную от Encoding.Unicode в .NET.Вам необходимо указать однозначные алгоритмы кодирования.Используйте UTF-8 для обеих платформ, и все должно быть в порядке.Вы также можете попробовать указать имя набора символов для метода getBytes на стороне Java;попробуйте getBytes("UTF-16")

1 голос
/ 13 июля 2010

GregS ответил на ваш вопрос напрямую; но в качестве отступления я бы рекомендовал клиенту не создавать сумму MD5. Если сервер управляет созданием суммы MD5, вы можете дополнительно гарантировать, что пароль не может быть восстановлен (например, радужная таблица), добавив значение «соль» в пароль перед его кодированием на сервере. Если вы делаете это на клиенте, вы должны предоставить клиенту соль, которая менее безопасна.

0 голосов
/ 08 ноября 2013

Вы проверяете формат?Многие языки создают одинаковые хэши, но в разных форматах.

Например:

5f45r5ssfds544g56fd4gfd56g4f6dgf

против

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

Попробуйте проверить оба формата при преобразовании в строку.

...