Comment puis-je calculer le hachage SHA-256 D'une chaîne dans Android?
j'essaie d'obtenir le SHA256 d'une chaîne dans Android.
voici le code PHP que je veux faire correspondre:
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 cela imprime: "a42yzk3axdv3k4yh98g8 "
Qu'est-ce que j'ai fait de mal ici?
Solution merci à 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));
}
2 réponses
La fonction PHP bin2hex
signifie qu'il prend une chaîne d'octets et l'encode comme un nombre hexadécimal.
dans le code Java, vous essayez de prendre un tas d'octets aléatoires et de les décoder comme une chaîne en utilisant le codage de caractères par défaut de votre plate-forme. Ça ne va pas marcher, et si ça marchait, ça ne produirait pas les mêmes résultats.
Voici une conversion binaire-à-hex rapide et sale pour Java:
static String bin2hex(byte[] data) {
return String.format("%0" + (data.length * 2) + 'x', new BigInteger(1, data));
}
C'est rapide écrire , pas nécessairement rapide à exécuter. Si vous faites beaucoup de ceux-ci, vous devriez réécrire la fonction avec une implémentation plus rapide.
vous êtes sur la bonne voie, mais convertir les octets est un peu plus compliqué. Cela fonctionne sur mon appareil:
// utility function
private static String bytesToHexString(byte[] bytes) {
// /q/in-java-how-do-i-convert-a-byte-array-to-a-string-of-hex-digits-while-keeping-leading-zeros-39756/"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: bytesToHexString la fonction est du projet IOSched .