From 8bf58cff18d68510e27e0dccf490c9792218044f Mon Sep 17 00:00:00 2001 From: Metall <25564543+metallnt@users.noreply.github.com> Date: Wed, 21 Sep 2022 08:32:53 +0500 Subject: [PATCH] Create DjangoPasswordVerifier.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Верификация PBKDF2_SHA256 --- .../auth/password/DjangoPasswordVerifier.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 LaunchServer/src/main/java/pro/gravit/launchserver/auth/password/DjangoPasswordVerifier.java diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/auth/password/DjangoPasswordVerifier.java b/LaunchServer/src/main/java/pro/gravit/launchserver/auth/password/DjangoPasswordVerifier.java new file mode 100644 index 00000000..14f9aef3 --- /dev/null +++ b/LaunchServer/src/main/java/pro/gravit/launchserver/auth/password/DjangoPasswordVerifier.java @@ -0,0 +1,42 @@ +package pro.gravit.launchserver.auth.password; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.bouncycastle.crypto.digests.SHA256Digest; +import org.bouncycastle.crypto.generators.PKCS5S2ParametersGenerator; +import org.bouncycastle.crypto.params.KeyParameter; + +import java.nio.charset.StandardCharsets; +import java.util.Base64; + +public class DjangoPasswordVerifier extends PasswordVerifier { + public final Integer DEFAULT_ITERATIONS = 10000; + private static final Logger logger = LogManager.getLogger(); + private static final String algorithm = "pbkdf2_sha256"; + + public String getEncodedHash(String password, String salt, int iterations) { + PKCS5S2ParametersGenerator generator = new PKCS5S2ParametersGenerator(new SHA256Digest()); + generator.init(password.getBytes(StandardCharsets.UTF_8), salt.getBytes(), iterations); + byte[] dk = ((KeyParameter) generator.generateDerivedParameters(256)).getKey(); + byte[] hashBase64 = Base64.getEncoder().encode(dk); + return new String(hashBase64); + } + + public String encode(String password, String salt, int iterations) { + String hash = getEncodedHash(password, salt, iterations); + return String.format("%s$%d$%s$%s", algorithm, iterations, salt, hash); + } + + @Override + public boolean check(String encryptedPassword, String password) { + String[] params = encryptedPassword.split("\\$"); + if (params.length != 4) { + logger.warn(" end 1 " + params.length); + return false; + } + int iterations = Integer.parseInt(params[1]); + String salt = params[2]; + String hash = encode(password, salt, iterations); + return hash.equals(encryptedPassword); + } +}