Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как получить хеш строки (SHA-256, MD5)

Короткий ответ

MessageDigest считает хеш от байтов. HexFormat (Java 17) превращает результат в строку из шестнадцатеричных цифр:

void main() throws Exception {
    MessageDigest digest = MessageDigest.getInstance("SHA-256");
    byte[] hash = digest.digest("hello".getBytes(StandardCharsets.UTF_8));
 
    IO.println(HexFormat.of().formatHex(hash));
}

Результат:

2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824

Другие алгоритмы

Имя алгоритма передаётся строкой. MD5 и SHA-1 подходят только для контрольных сумм, не для безопасности:

String hash(String algorithm, String text) throws Exception {
    byte[] bytes = MessageDigest.getInstance(algorithm).digest(text.getBytes(StandardCharsets.UTF_8));
    return HexFormat.of().formatHex(bytes);
}
 
void main() throws Exception {
    IO.println(hash("MD5", "hello"));
    IO.println(hash("SHA-1", "hello"));
}

Результат:

5d41402abc4b2a76b9719d911017c592
aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d

Хеш файла

Для файла передайте все его байты:

void main() throws Exception {
    Path file = Path.of("data.txt");
    Files.writeString(file, "hello");
 
    byte[] hash = MessageDigest.getInstance("SHA-256").digest(Files.readAllBytes(file));
    IO.println(HexFormat.of().formatHex(hash).substring(0, 16));
}

Результат:

2cf24dba5fb0a30e

Частая ошибка

Хранить пароли как SHA-256 или MD5. Такие хеши считаются очень быстро, и подобрать пароль перебором легко. Для паролей используйте медленные алгоритмы с солью — bcrypt, scrypt или Argon2 (например, BCryptPasswordEncoder из Spring Security).

Функции из этого ответа

  • Integer.toBinaryString() — Записывает число в двоичной системе. Рядом — toHexString() и toOctalString().

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.