MessageDigest hachages différemment sur différentes machines

Je vais avoir un problème avec MessageDigest de retour différentes valeurs de hachage sur des ordinateurs différents.

Un ordinateur exécute une version 32 bits de Java sur Windows Vista et l'autre est en cours d'exécution 64 bits de Java sur Mac OS. Je ne sais pas si c'est parce que MessageDigest est dépend de la machine, ou j'ai besoin de spécifier explicitement un codage de caractères quelque part, ou peut-être quelque chose d'autre. Voici l'
code:

public static boolean authenticate(String salt, String encryptedPassword, 
    char[] plainTextPassword ) throws NoSuchAlgorithmException {

    //do I need to explcitly specify character encoding here? -->
    String saltPlusPlainTextPassword = salt + new String(plainTextPassword);

    MessageDigest sha = MessageDigest.getInstance("SHA-512");

    //is this machine dependent? -->
    sha.update(saltPlusPlainTextPassword.getBytes());
    byte[] hashedByteArray = sha.digest();

    //or... perhaps theres a translation problem here? -->
    String hashed = new String(hashedByteArray);

    return hashed.equals(encryptedPassword);
}

Doit exécuter ce code différemment sur ces deux machines différentes?
Si elle est dépend de la machine de la façon dont je l'ai écrit, est-il une autre façon de hachage de ces mots de passe qui n'est plus portable? Merci!

Edit:::::

C'est le code que j'utilise pour générer les sels:

public static String getSalt() {
   int size = 16;
   byte[] bytes = new byte[size];
   new Random().nextBytes(bytes);
   return org.apache.commons.codec.binary.Base64.encodeBase64URLSafeString(bytes);
}

Solution:::

Grâce à la solution retenue, j'ai pu corriger mon code:

public static boolean authenticate_(String salt, String encryptedPassword, 
        char[] plainTextPassword ) throws NoSuchAlgorithmException, UnsupportedEncodingException {

        //This was ok
        String saltPlusPlainTextPassword = salt + new String(plainTextPassword);    

        MessageDigest sha = MessageDigest.getInstance("SHA-512");

        //must specify "UTF-8" encoding
        sha.update(saltPlusPlainTextPassword.getBytes("UTF-8"));
        byte[] hashedByteArray = sha.digest();

        //Use Base64 encoding here -->
        String hashed = org.apache.commons.codec.binary.Base64.encodeBase64URLSafeString(hashedByteArray);

        return hashed.equals(encryptedPassword);
    }
Êtes-vous en générer un nouveau sel à chaque fois?
Oui, il y a un autre sel pour chaque mot de passe.
Donc, une fois que vous générez le sel pour chaque mot de passe, où en êtes-vous de les stocker? Est-ce un endroit où les applications peuvent y avoir accès?
Oui, le sel est stocké dans le même dossier que le mot de passe crypté.

OriginalL'auteur Chris Dutrow | 2010-06-19