Java: Как сохранить необработанные данные строки UTF-8? - PullRequest
2 голосов
/ 26 апреля 2011

Я работаю на XMPP (Jabber) клиенте на Java и хочу подключиться к серверу через SASL.После некоторых исследований я нашел этот сайт , который объясняет весь механизм аутентификации.

Проблема в том, что я должен сохранить результат хеширования md5 в виде необработанных данных:

Вот хитрость - обычно, когда вы хэшируете вещи, вы получаете результат в шестнадцатеричных значениях.Но мы не хотим, чтобы этот результат представлял собой строку шестнадцатеричных значений!Нам нужно сохранить результат как необработанные данные!Если вы сделаете шестнадцатеричный дамп этих данных, вы обнаружите, что это «3a4f5725a748ca945e506e30acd906f0».Но помните, нам нужно работать с необработанными данными, поэтому не конвертируйте их в строку.

Как этого можно достичь в Java?И если я не должен конвертировать результат в строку, как я должен работать с ним впоследствии, когда мне нужно использовать его в другом хешировании md5?


И, к вашему сведению, это частьмой школьный проект (это не обязательно, и нет, я не обманываю, обращаясь за помощью).И я говорю это, потому что мне запрещено использовать нестандартные библиотеки JDK (например, com.sun.org.apache).

Ответы [ 3 ]

1 голос
/ 26 апреля 2011

Если кому-то нужен код, который вычисляет ответ Строка для запроса XMPP SASL, вот она:

private static byte[] combineByteArrays(byte[] a, byte[] b) { // combines two byte[] arrays
    byte[] result = new byte[a.length + b.length];
    System.arraycopy(a, 0, result, 0, a.length);
    for (int i = a.length; i < result.length; i++) {
        result[i] = b[i-a.length];            
    }
    return result;
}

private static String byteArrayToHex(byte[] array) {  // returns hex representation of byte[] array
    String resultStr = "";
    for (int i=0; i < array.length; i++) {
        resultStr += Integer.toString( ( array[i] & 0xff ) + 0x100, 16).substring( 1 );
    }
    return resultStr;
}

private static String computeResponse(String username, String password, String realm, String nonce, String qop, String cnonce, String digest_uri, String nc) throws NoSuchAlgorithmException {  // computes response for challenge query of XMPP server
    MessageDigest md5 = MessageDigest.getInstance("MD5");
    final byte[] part1 = md5.digest(combineByteArrays(md5.digest((username + ":" + realm + ":" + password).getBytes()), (":" + nonce + ":" + cnonce).getBytes()));
    final byte[] part2 = md5.digest(combineByteArrays("AUTHENTICATE:".getBytes(), digest_uri.getBytes()));
    final byte[] temp = combineByteArrays(byteArrayToHex(part1).getBytes(), (":" + nonce + ":" + nc + ":" + cnonce + ":" + qop + ":").getBytes());
    final byte[] part3  = md5.digest(combineByteArrays(temp, byteArrayToHex(part2).getBytes()));
    return byteArrayToHex(part3);
}

public static void main(String[] args) throws NoSuchAlgorithmException {

    /* example data from http://deusty.blogspot.com/2007/09/example-please.html */
    String username = "test";
    String password = "secret";
    String realm = "osXstream.local";
    String nonce = "392616736";
    String qop = "auth";
    String cnonce = "05E0A6E7-0B7B-4430-9549-0FE1C244ABAB";
    String digest_uri = "xmpp/osXstream.local";
    String nc = "00000001";        

    /* prints out "37991b870e0f6cc757ec74c47877472b" */
    System.out.println(computeResponse(username, password, realm, nonce, qop, cnonce, digest_uri, nc));  
}

Надеюсь, это поможет.

1 голос
/ 26 апреля 2011

Класс MessageDigest в Java может использоваться для предоставления хеша MD5. Хэш MD5, который вы получаете, получает byte[] и возвращает byte[]. Просто держите в руках возвращенное byte[]. Глядя на веб-страницу, на которую вы дали ссылку, похоже, что вы будете делать другие byte[] и будете копировать промежуточные результаты в фрагменты других byte[], а затем хэшировать их.

0 голосов
/ 26 апреля 2011

Извините, но я не совсем понимаю, что вы подразумеваете под "необработанными данными".

На самом деле, если у вас есть поток байтов или что-то в этом роде, вместо преобразования его в шестнадцатеричную строку, просто сохраняйтеиспользуя этот байтовый поток / массив ...

Я думаю, что не рекомендуется использовать строку, потому что если вы конвертируете байты в шестнадцатеричную строку представления, у вас может возникнуть соблазн использовать myHexString.getBytes ("UTF-8") это не вернуло бы соответствующий байтовый массив, который вы ожидаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...