Как создать ключ SHA1 в Java, чтобы соответствовать SHA1-ключу, сгенерированному в C [duplicate]

Я нашел свои решения здесь: link: Eloquent create говорит, что столбец не имеет значения по умолчанию

Ответ внизу, я просто процитировал ответ также

imbhavin95 ответил 8 месяцев назад

Причина, по которой сейчас происходит, заключается в том, что Laravel 5.1 по умолчанию использует строгий режим для MySQL.

Если вы например, вернуться к предыдущему поведению, обновить файл config / database.php и установить «strict» => false для вашего соединения.

blockquote>

кредиты этому человеку https: // laravel .io / пользователь / imbhavin95

121
задан Joachim Sauer 4 February 2011 в 08:29
поделиться

11 ответов

UPDATE Вы можете использовать Apache Commons Codec (версия 1.7+), чтобы выполнить это задание для вас.

DigestUtils.sha1Hex(stringToConvertToSHexRepresentation)

Благодаря @ Jon Onstott для этого предложения.


Старый ответ Преобразуйте байт-массив в шестнадцатеричную строку. Real How How сообщает вам, как .

return byteArrayToHexString(md.digest(convertme))

и (скопирован из Real's How To)

public static String byteArrayToHexString(byte[] b) {
  String result = "";
  for (int i=0; i < b.length; i++) {
    result +=
          Integer.toString( ( b[i] & 0xff ) + 0x100, 16).substring( 1 );
  }
  return result;
}

Кстати, вы можете получить более компактное представление с использованием Base64. Apache Commons Codec API 1.4, имеет эту приятную утилиту, чтобы убрать всю боль. см. здесь

148
ответ дан Community 21 August 2018 в 11:27
поделиться
  • 1
    base64 и sha1 очень разные - не предлагайте их в качестве альтернатив. – Ryan A. 22 August 2013 в 20:15
  • 2
    @RyanA: Насколько я понимаю, он предлагает base64 в качестве альтернативы hex-кодированию SHA1-хеша (не как альтернатива SHA1 целиком). – helmbert 30 August 2013 в 11:22
  • 3
    @helmbert Надеюсь! – Ryan A. 30 August 2013 в 18:32
  • 4
    Почему бы не использовать библиотеку, подобную DigestUtils.sha1Hex("my string"), а не изобретать колесо (хотя интересно знать, как конвертировать в шестнадцатеричный)? – Jon Onstott 23 June 2015 в 15:34
  • 5
    Потому что, когда этот ответ был написан, DigestUtils (1.7 был выпущен в сентябре 2012 года) не имел этой функции. Спасибо за указание на это. +1 – Nishant 24 June 2015 в 05:29

Просто используйте библиотеку кодеков apache commons. У них есть класс утилиты под названием DigestUtils

Не нужно вдаваться в подробности.

26
ответ дан DaTroop 21 August 2018 в 11:27
поделиться
  • 1
    Я не согласен, вникание в детали - вот что – ninesided 4 February 2011 в 09:55
  • 2
    Вопрос в том, есть ли у вас время для подробностей или нет. Весь смысл, как правило, делать это вовремя. Не все студенты или есть возможность узнать все подробности. – DaTroop 13 August 2012 в 11:50
  • 3
    DigestUtils возвращает массив байтов, поэтому для получения строкового представления вам нужно запустить его через Hex.encodeHexString. Java: это 2014 год, и у нас все еще нет одного шага – ryber 7 October 2014 в 21:55
  • 4
    Один шаг SHA-1: String result = DigestUtils.sha1Hex("An input string"); o) – Jon Onstott 23 June 2015 в 05:58

Преобразовать байтовый массив в шестнадцатеричную строку.

public static String toSHA1(byte[] convertme) {
    final char[] HEX_CHARS = "0123456789ABCDEF".toCharArray();
    MessageDigest md = null;
    try {
        md = MessageDigest.getInstance("SHA-1");
    }
    catch(NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    byte[] buf = md.digest(convertme);
    char[] chars = new char[2 * buf.length];
    for (int i = 0; i < buf.length; ++i) {
        chars[2 * i] = HEX_CHARS[(buf[i] & 0xF0) >>> 4];
        chars[2 * i + 1] = HEX_CHARS[buf[i] & 0x0F];
    }
    return new String(chars);
}
0
ответ дан Diego Agulló 21 August 2018 в 11:27
поделиться

Это неправильно печатается, потому что вам нужно использовать кодировку Base64. С помощью Java 8 вы можете кодировать с помощью Base64 класса энкодера.

public static String toSHA1(byte[] convertme) {
    md = MessageDigest.getInstance("SHA-1");
    return Base64.getEncoder().encodeToString((md.digest(convertme));
}

Результат

Это даст вам ожидаемый результат работы 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8

3
ответ дан Eduardo Dennis 21 August 2018 в 11:27
поделиться
  • 1
    @Devenv это SHA-1 три точки означает, что он сохранит свой исходный код, который преобразуется в sha1. Первоначальная проблема OP заключалась в правильной печати строки. – Eduardo Dennis 16 May 2017 в 15:04

SHA-1 (и все остальные алгоритмы хэширования) возвращают двоичные данные. Это означает, что (на Java) они создают byte[]. Этот массив byte не представляет никаких конкретных символов, а это означает, что вы не можете просто превратить его в String, как и вы.

Если вам нужен String, тогда вы должны отформатировать этот byte[] таким образом, который может быть представлен как String (в противном случае просто сохраните byte[]).

Два общих способа представления произвольных byte[], поскольку печатными символами являются BASE64 или простые шестнадцатеричные строки (т.е. представляющие каждый byte на две шестнадцатеричные цифры). Похоже, вы пытаетесь создать шестнадцатеричную строку.

Там также есть еще одна ошибка: если вы хотите получить SHA-1 Java String, вам нужно преобразовать это String до byte[] в первую очередь (поскольку вход SHA-1 также является byte[]). Если вы просто используете myString.getBytes(), как вы показали, то он будет использовать кодировку по умолчанию для платформы и, как таковая, будет зависеть от среды, в которой вы ее запускаете (например, он может возвращать разные данные на основе языкового / языкового значения вашей ОС ).

Лучшее решение - указать кодировку, используемую для преобразования String -to- byte[] следующим образом: myString.getBytes("UTF-8"). Выбор UTF-8 (или другого кодирования, который может представлять каждый символ Юникода) является самым безопасным выбором здесь.

26
ответ дан Joachim Sauer 21 August 2018 в 11:27
поделиться

Как упоминалось ранее, используйте кодек apache commons. Рекомендуется также ребятам весны (см. DigestUtils in spring doc). Например ::

DigestUtils.sha1Hex(b);

Определенно не использовали бы здесь наивысший рейтинг.

18
ответ дан kazuar 21 August 2018 в 11:27
поделиться

Это простое решение, которое можно использовать при преобразовании строки в шестнадцатеричный формат:

private static String encryptPassword(String password) throws NoSuchAlgorithmException, UnsupportedEncodingException {

    MessageDigest crypt = MessageDigest.getInstance("SHA-1");
    crypt.reset();
    crypt.update(password.getBytes("UTF-8"));

    return new BigInteger(1, crypt.digest()).toString(16);
}
22
ответ дан Patrick W. McMahon 21 August 2018 в 11:27
поделиться
  • 1
    Предупреждение: Хэш-генерация неверна для хешей, начинающихся с «0». Вы получите строку с 39 символами. – philn 2 November 2016 в 13:54
  • 2
    @philn вы могли бы предложить решение? – Nikita Koksharov 2 November 2016 в 13:54
  • 3
    Я предполагаю, что если вы создадите большое целое число из байта [] с достаточным количеством начальных нулей, эти 0s будут потеряны. Таким образом, представление шестнадцатеричной строки "0" не будет там, что приведет к хешу с 39 или даже меньшими символами. Я использовал решение petrnohejls выше, и он отлично работает ... – philn 2 November 2016 в 22:45

Это мое решение преобразования строки в sha1. Он отлично работает в моем приложении для Android:

private static String encryptPassword(String password)
{
    String sha1 = "";
    try
    {
        MessageDigest crypt = MessageDigest.getInstance("SHA-1");
        crypt.reset();
        crypt.update(password.getBytes("UTF-8"));
        sha1 = byteToHex(crypt.digest());
    }
    catch(NoSuchAlgorithmException e)
    {
        e.printStackTrace();
    }
    catch(UnsupportedEncodingException e)
    {
        e.printStackTrace();
    }
    return sha1;
}

private static String byteToHex(final byte[] hash)
{
    Formatter formatter = new Formatter();
    for (byte b : hash)
    {
        formatter.format("%02x", b);
    }
    String result = formatter.toString();
    formatter.close();
    return result;
}
59
ответ дан petrnohejl 21 August 2018 в 11:27
поделиться
  • 1
    Может потребоваться указать, что это java.util.Formatter и в конце нуждается в formatter.close (), чтобы избежать предупреждения. – Eric Chen 13 September 2012 в 20:45
  • 2
    Не должны ли encryptPassword("test") и echo test|sha1sum в терминале linux получить тот же результат? Они этого не делают. – Tulains Córdova 17 December 2014 в 14:14
  • 3
    @ TulainsCórdova Что касается вызова консоли: если вы используете echo test, вывод, включающий разрыв строки, будет передан по каналу на sha1sum. Если вы хотите хэшировать простую строку без прерывания строки, вы можете использовать echo -n test | sha1sum. Параметр -n делает echo без разрыва строки. – MrSnrub 27 July 2018 в 00:04

База 64 Представление SHA1 Хэш:

String hashedVal = Base64.getEncoder().encodeToString(DigestUtils.sha1(stringValue.getBytes(Charset.forName("UTF-8"))));
0
ответ дан PUG 21 August 2018 в 11:27
поделиться

Использование Класс Hava Hashing :

Hashing.sha1().hashString( "password", Charsets.UTF_8 ).toString()
48
ответ дан Shashwat Khanna 21 August 2018 в 11:27
поделиться

Причина, по которой это не работает, заключается в том, что когда вы вызываете String(md.digest(convertme)), вы говорите Java, чтобы интерпретировать последовательность зашифрованных байтов как строку. Вы хотите преобразовать байты в шестнадцатеричные символы.

1
ответ дан Zarkonnen 21 August 2018 в 11:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: