J'essaie d'obtenir le SHA256 d'une chaîne dans Android.
Voici le code PHP que je veux associer:
echo bin2hex(mhash(MHASH_SHA256,"asdf"));
//outputs "f0e4c2f76c58916ec258f246851bea091d14d4247a2fc3e18694461b1816e13b"
Maintenant, en Java, j'essaie de faire ce qui suit:
String password="asdf"
MessageDigest digest=null;
try {
digest = MessageDigest.getInstance("SHA-256");
} catch (NoSuchAlgorithmException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
digest.reset();
try {
Log.i("Eamorr",digest.digest(password.getBytes("UTF-8")).toString());
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Mais ceci affiche: "a42yzk3axdv3k4yh98g8"
Qu'est-ce que j'ai mal fait ici?
Solution grâce à erickson:
Log.i("Eamorr",bin2hex(getHash("asdf")));
public byte[] getHash(String password) {
MessageDigest digest=null;
try {
digest = MessageDigest.getInstance("SHA-256");
} catch (NoSuchAlgorithmException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
digest.reset();
return digest.digest(password.getBytes());
}
static String bin2hex(byte[] data) {
return String.format("%0" + (data.length*2) + "X", new BigInteger(1, data));
}
La fonction PHP bin2hex
signifie qu’elle prend une chaîne d’octets et la code sous forme de nombre hexadécimal.
Dans le code Java, vous essayez de prendre un tas d'octets aléatoires et de les décoder en tant que chaîne en utilisant le codage de caractères par défaut de votre plate-forme. Cela ne fonctionnera pas et si cela se produisait, les résultats ne seraient pas les mêmes.
Voici une conversion rapide et compliquée de Java à hexadécimal:
static String bin2hex(byte[] data) {
StringBuilder hex = new StringBuilder(data.length * 2);
for (byte b : data)
hex.append(String.format("%02x", b & 0xFF));
return hex.toString();
}
Ceci est rapide pour write , pas nécessairement rapide à exécuter. Si vous en faites beaucoup, vous devriez réécrire la fonction avec une implémentation plus rapide.
Vous êtes sur la bonne voie, mais la conversion des octets est un peu plus compliquée. Cela fonctionne sur mon appareil:
// utility function
private static String bytesToHexString(byte[] bytes) {
// http://stackoverflow.com/questions/332079
StringBuffer sb = new StringBuffer();
for (int i = 0; i < bytes.length; i++) {
String hex = Integer.toHexString(0xFF & bytes[i]);
if (hex.length() == 1) {
sb.append('0');
}
sb.append(hex);
}
return sb.toString();
}
// generate a hash
String password="asdf";
MessageDigest digest=null;
String hash;
try {
digest = MessageDigest.getInstance("SHA-256");
digest.update(password.getBytes());
hash = bytesToHexString(digest.digest());
Log.i("Eamorr", "result is " + hash);
} catch (NoSuchAlgorithmException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Source: la fonction bytesToHexString provient du projet IOSched .