Как я могу вычислить хэш SHA-256 строки в Android?

Я пытаюсь получить SHA256 строки в Android.

Вот код PHP, который я хочу сопоставить:

echo bin2hex(mhash(MHASH_SHA256,"asdf")); //outputs "f0e4c2f76c58916ec258f246851bea091d14d4247a2fc3e18694461b1816e13b" 

Теперь, на Java, я пытаюсь сделать следующее:

  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(); } 

Но это печатает: «a42yzk3axdv3k4yh98g8»

Что я сделал здесь неправильно?


Решение благодаря 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)); } 

Related of "Как я могу вычислить хэш SHA-256 строки в Android?"

Функция PHP bin2hex означает, что она берет строку байтов и кодирует ее как шестнадцатеричное число.

В коде Java вы пытаетесь взять кучу случайных байтов и декодировать их как строку, используя кодировку символов по умолчанию вашей платформы. Это не сработает, и если бы это было так, это не принесло бы таких же результатов.

Вот быстрое и грязное преобразование двоично-шестнадцатеричного кода для Java:

 static String bin2hex(byte[] data) { return String.format("%0" + (data.length * 2) + 'x', new BigInteger(1, data)); } 

Это быстро написать , не обязательно быстро выполнить. Если вы делаете много из них, вы должны переписать функцию с более быстрой реализацией.

Вы находитесь по правильной линии, но преобразование байтов немного сложнее. Это работает на моем устройстве:

 // 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(); } 

Источник: функция bytesToHexString из проекта IOSched .