Intereting Posts
Есть ли способ использовать jQuery для отправки формы без сложного поля путем разбивки поля? Как предотвратить загрузку файлов PHP? И каким образом кто-то может их загрузить? нет рабочего отключения текстового поля, когда записи больше одного CodeIgniter: как получить вход от View и использовать его в контроллере Получить записи Cname с помощью NetDNS или get_dns_record YUICompressor или подобное в PHP? Как я могу остановить HTTP из экранов кавычек? В раскрывающемся списке «Часовой пояс» укажите доступные часовые пояса в зависимости от страны? Широкий доступ ODBC от PHP на Linux? CActiveForm и ajaxSubmitButton не работают Поместите содержимое файла в массив с разделителем и сохраните его в базе данных (php) Могу ли я POST и GET на той же странице PHP Обнаружение браузера в приложении (WebView) с помощью PHP / Javascript Opencart: Как связать параметры продукта (например, размер и цвет)? Ошибка инструкции обновления PHP для unixODBC

Java MessageDigest SHA1-алгоритм возвращает другой результат, чем SHA1-функция php

У меня есть таблица SQL с именами пользователей и паролями. Пароли кодируются с помощью метода digest () MessageDigest. Если я закодирую пароль – скажем, «abcdef12» – с помощью метода digest () MessageDigest и затем преобразует его в шестнадцатеричные значения, String отличается от того, что я делаю то же самое с использованием SHA1-метода PHP. Я бы ожидал, что эти значения будут точно такими же.

Код, который используется для кодирования паролей:

MessageDigest md = MessageDigest.getInstance("SHA-1"); byte[] passbyte; passbyte = "abcdef12".getBytes("UTF-8"); passbyte = md.digest(passbyte); 

Преобразование String в шестнадцатеричное выполняется с помощью этого метода:

 public static String convertStringToHex(String str) { char[] chars = str.toCharArray(); StringBuffer hex = new StringBuffer(); for (int i = 0; i < chars.length; i++) { hex.append(Integer.toHexString((int) chars[i])); } return hex.toString(); } 

Пароль: abcdef12

Вот пароль, возвращенный множеством сетевых генераторов SHA1-хешей и PHP SHA1 () – функция: d253e3bd69ce1e7ce6074345fd5faa1a3c2e89ef

Вот пароль, закодированный MessageDigest: d253e3bd69ce1e7ce674345fd5faa1a3c2e2030ef

Я что-то забыл?

Игорь.

Изменить: Я нашел кого-то с аналогичной проблемой: C # SHA-1 и PHP SHA-1 … Различные результаты? , Решение заключалось в изменении кодировок .. но я не могу изменять кодировки на стороне сервера, так как пароли в этой SQL-таблице не созданы моим приложением. Я использую клиентскую SHA1-кодировку с использованием JavaScript SHA1-класса (точнее: класс Google Web Toolkit). Он работает и кодирует строку, как ожидалось, но, видимо, используя символы ASCII? ..

Это не имеет никакого отношения к кодировкам. Результат будет совершенно другим.

Во-первых, ваша функция convertStringToHex() не выводит ведущие нули, т. convertStringToHex() 07 становится всего 7 .

Остальные (с 89 по 2030 ) также могут иметь какое-то отношение к этой функции. Попробуйте взглянуть на значение passbyte после passbyte = md.digest(passbyte); ,

У меня есть тот же дайджест, что и PHP с моей хэш-функцией Java SHA-1:

 public static String computeSha1OfString(final String message) throws UnsupportedOperationException, NullPointerException { try { return computeSha1OfByteArray(message.getBytes(("UTF-8"))); } catch (UnsupportedEncodingException ex) { throw new UnsupportedOperationException(ex); } } private static String computeSha1OfByteArray(final byte[] message) throws UnsupportedOperationException { try { MessageDigest md = MessageDigest.getInstance("SHA-1"); md.update(message); byte[] res = md.digest(); return toHexString(res); } catch (NoSuchAlgorithmException ex) { throw new UnsupportedOperationException(ex); } } 

Я добавил к моим модульным тестам:

 String sha1Hash = StringHelper.computeSha1OfString("abcdef12"); assertEquals("d253e3bd69ce1e7ce6074345fd5faa1a3c2e89ef", sha1Hash); 

Полный исходный код для класса находится на github .

Попробуйте это – он работает для меня:

 MessageDigest md = MessageDigest.getInstance(algorithm); md.update(original.getBytes()); byte[] digest = md.digest(); StringBuffer sb = new StringBuffer(); for (byte b : digest) { sb.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1)); } return sb.toString(); 

С уважением, Конки

Или попробуйте следующее:

 MessageDigest md = MessageDigest.getInstance("SHA-1"); md.update(clearPassword.getBytes("UTF-8")); return new BigInteger(1 ,md.digest()).toString(16)); 

Cheers Roy