Как получить хеш строки (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().