package com.imyeyu.utils; import de.mkammerer.argon2.Argon2; import de.mkammerer.argon2.Argon2Factory; import java.math.BigInteger; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * @author 夜雨 * @version 2023-08-07 14:27 */ public class Digest { public static String md5(String data) { return md5(data, StandardCharsets.UTF_8); } public static String md5(String data, Charset charset) { return md5(data.getBytes(charset)); } public static String md5(byte[] data) { try { if (data == null || data.length == 0) { return null; } MessageDigest md5 = MessageDigest.getInstance("MD5"); md5.update(data); byte[] bytes = md5.digest(); char[] chars = new char[bytes.length * 2]; for (int i = 0, j = 0; i < bytes.length; i++) { chars[j++] = Text.HEX_DIGITS_LOWER[bytes[i] >>> 4 & 0xF]; chars[j++] = Text.HEX_DIGITS_LOWER[bytes[i] & 0xF]; } return new String(chars); } catch (NoSuchAlgorithmException e) { throw new UnsupportedOperationException("unsupported md5 digest"); } } public static String sha1(String data) { return sha1(data, StandardCharsets.UTF_8); } public static String sha1(String data, Charset charset) { return sha1(data.getBytes(charset)); } public static String sha1(byte[] bytes) { try { MessageDigest sha = MessageDigest.getInstance("SHA"); sha.update(bytes); return Encoder.hex(sha.digest()); } catch (NoSuchAlgorithmException e) { throw new UnsupportedOperationException("unsupported sha1 digest"); } } public static String sha256(String data) { return sha256(data, StandardCharsets.UTF_8); } public static String sha256(String data, Charset charset) { return sha256(data.getBytes(charset)); } public static String sha256(byte[] bytes) { try { MessageDigest sha = MessageDigest.getInstance("SHA-256"); sha.update(bytes); return Encoder.hex(sha.digest()); } catch (NoSuchAlgorithmException e) { throw new UnsupportedOperationException("unsupported sha256 digest"); } } public static String sha512(String data) { return sha512(data, StandardCharsets.UTF_8); } public static String sha512(String data, Charset charset) { return sha512(data.getBytes(charset)); } public static String sha512(byte[] bytes) { try { MessageDigest sha = MessageDigest.getInstance("SHA-512"); BigInteger number = new BigInteger(1, sha.digest(bytes)); StringBuilder result = new StringBuilder(number.toString(16)); while (result.length() < 64) { result.insert(0, "0"); } return result.toString(); } catch (NoSuchAlgorithmException e) { throw new UnsupportedOperationException("unsupported sha512 digest"); } } public static String argon2id(String password) { return argon2id(10, 65536, 1, password); } public static String argon2id(int iterations, int memory, int parallelism, String password) { Argon2 argon2id = Argon2Factory.create(Argon2Factory.Argon2Types.ARGON2id); return argon2id.hash(iterations, memory, parallelism, password.toCharArray()); } public static boolean argon2idVerify(String passwordHash, String password) { Argon2 argon2id = Argon2Factory.create(Argon2Factory.Argon2Types.ARGON2id); return argon2id.verify(passwordHash, password.toCharArray()); } }