2013-11-20 2 views
2

Am пытается хэш моих строк и придумал следующий код:String.getBytes («UTF-8») не является независимым от платформы?

import java.io.UnsupportedEncodingException; 
import java.nio.charset.Charset; 
import java.security.NoSuchAlgorithmException; 
import java.security.MessageDigest; 
import sun.misc.BASE64Encoder; 

public class JavaTest { 
    public static void main (String[] args) throws UnsupportedEncodingException, NoSuchAlgorithmException { 
     String rawString = "9498131529"; 
     System.out.println(Charset.defaultCharset()); 
     System.out.println(rawString); 

     MessageDigest digest = MessageDigest.getInstance("MD5"); 
     digest.update(rawString.getBytes("UTF-8")); 
     BASE64Encoder encoder = new BASE64Encoder(); 
     byte hashedBytes[] = (new String(digest.digest(), "UTF-8")).getBytes(); 
     System.out.println(encoder.encode(hashedBytes)); 
    } 
} 

я был под впечатлением, что этот кусок кода должен быть независимой от платформы, так как, когда я пытаюсь получить байты из строки I задав тип кодировки «UTF-8».

Но когда я побежал код на моей среде Mac, Дев и постановка среды я получил следующий результат: Mac

MacRoman 
9498131529 
XElaLD8UPzE/P1sWDz8/Pw== 

Dev:

US-ASCII 
9498131529 
XElaLD8UPzE/P1sWDz8/Pw== 

Олень ING

UTF-8 
9498131529 
XElaLO+/vRTvv70x77+977+9WxYP77+977+977+9 

Моя конфигурация:

Mac

> sw_vers 
ProductName: Mac OS X 
ProductVersion: 10.9 
BuildVersion: 13A603 

Dev

> cat /proc/version 
Linux version 2.6.21.7-2.fc8xen-ec2-v1.0 (gcc version 4.1.2 20070925 (Red Hat 4.1.2-33)) #2 SMP Tue Sep 1 10:04:29 EDT 2009 

Балетмейстер

> cat /proc/version 
Linux version 3.2.0-31-virtual (gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)) #50-Ubuntu SMP Fri Sep 7 16:36:36 UTC 2012 

Что я здесь отсутствует? Почему система алгоритма хеширования независима? И я считаю, что MD5 должен быть независимым от платформы в соответствии со спецификацией. Я ошибаюсь в своих предположениях?

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация!

+3

Стадии где вы спускоподъемная дайджест и из строки ('новой строки (digest.digest(), "UTF-8") GetBytes (.) ') выглядит подозрительно. (И ненужно - вы должны, вероятно, основывать 64-й дайджест.) Возможно, дайджест не может быть действительным UTF-8, и то, что вы видите, может быть другой обработкой ошибок декодирования. – millimoose

+0

Собственно, подождите, наверное, именно там, где все идет не так. '.getBytes()' без аргумента кодирует строку в кодировке по умолчанию, а MacRoman и US-ASCII могут быть достаточно похожи, чтобы совпадение приводило к такому же результату. Использование '.getBytes (« UTF-8 »)' * должно * привести вас к одинаковому поведению повсюду, но это все еще не так. – millimoose

+0

@millimoose Спасибо за ваши данные! :) Я думаю, Стефан избил тебя до ответа. –

ответ

2

Зачем нужна дополнительная поездка в оба конца через String? Даже если вы добавите «UTF-8» в getBytes(), все равно будет неправильно, потому что он будет обрабатывать массив исходных байтов (дайджест), как если бы это была кодированная строка UTF-8.

Изменения hashedBytes линия:

byte hashedBytes[] = digest.digest(); 
+0

Спасибо! Имеют смысл. –

Смежные вопросы