SHA1 в Java и PHP с разными результатами

Я знаю, что есть несколько вопросов, подобных этому, но я пробовал каждое решение, которое я нашел в stackoverflow, и я до сих пор не получил ожидаемого результата.

Я пытаюсь преобразовать строку в sha1 в Java и PHP, но у меня разные результаты. Строка генерируется случайным образом. Я проверил строку на обоих концах, и они одинаковые (даже попробовав инструмент онлайн-сравнения).

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

Одна строка, с которой я пытался хэш с sha1: UgJaDVYEClRUD1cAAVUBVwRTB1MDAA9SBgcDBwNXAwNZBQdUAAACBA==

Результат Java: 72c9bbe7eed0efe5e82ea9568136d8f52347259e

Результат PHP: f720d73d18a7bb9cf36808af17ce40621ebfb405

Код Java

 public static String sha1(String toHash) { String hash = null; try { MessageDigest digest = MessageDigest.getInstance("SHA-1"); byte[] bytes = toHash.getBytes("ASCII"); //I tried UTF-8, ISO-8859-1... digest.update(bytes, 0, bytes.length); bytes = digest.digest(); StringBuilder sb = new StringBuilder(); for(byte b : bytes) { sb.append(String.format("%02X", b)); } hash = sb.toString(); } catch(NoSuchAlgorithmException e) { e.printStackTrace(); } catch(UnsupportedEncodingException e) { e.printStackTrace(); } return hash.toLowerCase(Locale.ENGLISH); } 

PHP-код

 sha1("UgJaDVYEClRUD1cAAVUBVwRTB1MDAA9SBgcDBwNXAwNZBQdUAAACBA=="); 

Любая помощь будет оценена

Обновить

В Java и PHP я делал следующее:

Ява

 String toHash = "qwerty"; String hash = sha1(toHash); //Prints: b1b3773a05c0ed0176787a4f1574ff0075f7521e toHash = Base64.encodeToString(toHash.getBytes("ASCII"), Base64.DEFAULT); hash = sha1(toHash); //Prints: 88bfb2d77c3b42823bab820c1737f03c97d87c1b 

PHP

 $toHash = "qwerty"; sha1($toHash); //Prints: b1b3773a05c0ed0176787a4f1574ff0075f7521e sha1(base64_encode($toHash)); //Prints: 278aa0e8dde2af58a4eed613467da219a35c5278 

Я предполагаю, что кодировка Base64 делает что-то для строки, которая отличается от PHP и Java, какие-либо мысли о том, почему?

ОБНОВЛЕНИЕ 2

Я должен был быть более ясным, извините за это, я имею в виду:

Вывод Java

 sha1(Base64.encodeToString("qwerty".getBytes("ASCII"), Base64.DEFAULT)); 

Отличается от того, что вывод PHP

 sha1(base64_encode("qwerty")); 

ОБНОВЛЕНИЕ 3

Хотя обе кодированные в base64 строки равны cXdlcnR5 .

В основном:

 - sha1("qwerty") == sha1("qwerty") - Base64.encodeToString("qwerty".getBytes(), Base64.DEFAULT) == base64_encode("qwerty") - sha1(Base64.encodeToString("qwerty".getBytes(), Base64.DEFAULT)) != sha1(base64_encode("qwerty")) 

Я уже отказался от кодировки base64 в строках, которые я hash, но я все еще хотел бы знать, что я мог бы сделать, чтобы заставить его работать.

редактировать

Вы используете переменную toHash дважды в методе encodeToString делая вторую строку кода избыточной.

Этот код

 String toHash = "qwerty"; String hash = sha1(toHash); //Prints: b1b3773a05c0ed0176787a4f1574ff0075f7521e toHash = Base64.encodeToString(toHash.getBytes("ASCII"), Base64.DEFAULT); hash = sha1(toHash); //Prints: 88bfb2d77c3b42823bab820c1737f03c97d87c1b 

Эквивалентен этому коду

 String toHash = "qwerty"; toHash = Base64.encodeToString(toHash.getBytes("ASCII"), Base64.DEFAULT); hash = sha1(toHash); //Prints: 88bfb2d77c3b42823bab820c1737f03c97d87c1b 

Таким образом, по существу в java вы

  • Получение Base64 для "qwerty"
  • Получение sha1 по такому результату

При использовании PHP вы

  • Получение sha1 для "qwerty"
  • Получив Base64 на этом результате

Я предполагаю, что вы ошибались

Спустя 3 года я столкнулся с тем же вопросом, но на этот раз я понял проблему. Вот решение любому, кто наткнулся на этот вопрос:

Я использовал:

 sha1("qwerty") == sha1("qwerty") Base64.encodeToString("qwerty".getBytes(), Base64.DEFAULT) == base64_encode("qwerty") sha1(Base64.encodeToString("qwerty".getBytes(), Base64.DEFAULT)) != sha1(base64_encode("qwerty")) 

Проблема с этим – Base64.DEFAULT , поведение по умолчанию Base64 обертывает строку (добавляет \n к строке). Чтобы получить тот же результат, что и метод PHP, вы должны использовать Base64.NO_WRAP :

 sha1("qwerty") == sha1("qwerty") Base64.encodeToString("qwerty".getBytes(), Base64.NO_WRAP) == base64_encode("qwerty") sha1(Base64.encodeToString("qwerty".getBytes(), Base64.NO_WRAP)) == sha1(base64_encode("qwerty")) 

После того как я сделал это изменение, он начал работать