Compare commits

...

6 Commits

Author SHA1 Message Date
Metall 06d56064c4
Merge 8f20cbe104 into 1ebe68f5b8 2024-04-02 01:29:31 +03:00
XakepSDK 1ebe68f5b8
[ANY] Add query helper (#708)
* [ANY] Add query helper

* [ANY] Rename AuthCodePassword field to the uri

---------

Co-authored-by: d3coder <admin@xakeps.dk>
2024-04-02 00:09:38 +07:00
Metall 8f20cbe104
Merge branch 'GravitLauncher:master' into master 2023-03-27 20:27:50 +05:00
Metall 66d8b9d9ca
Update PasswordVerifier.java
Убрал исключения для совместимости
2022-09-21 09:29:13 +05:00
Metall 90ee90973e
Update PasswordVerifier.java
Добавил:
1. Способ верификации "django", для осуществления авторизации с помощью PBKDF2 с SHA256.
2. Исключение на отсутствующий алгоритм(NoSuchAlgorithmException)
3. Исключение на неверные ключи(InvalidKeySpecException)
2022-09-21 08:40:40 +05:00
Metall 8bf58cff18
Create DjangoPasswordVerifier.java
Верификация PBKDF2_SHA256
2022-09-21 08:32:53 +05:00
5 changed files with 83 additions and 3 deletions

View File

@ -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);
}
}

View File

@ -15,6 +15,7 @@ public abstract class PasswordVerifier {
providers.register("bcrypt", BCryptPasswordVerifier.class);
providers.register("accept", AcceptPasswordVerifier.class);
providers.register("reject", RejectPasswordVerifier.class);
providers.register("django", DjangoPasswordVerifier.class);
registeredProviders = true;
}
}

View File

@ -3,10 +3,10 @@ package pro.gravit.launcher.base.request.auth.password;
import pro.gravit.launcher.base.request.auth.AuthRequest;
public class AuthCodePassword implements AuthRequest.AuthPasswordInterface {
public final String code;
public final String uri;
public AuthCodePassword(String code) {
this.code = code;
public AuthCodePassword(String uri) {
this.uri = uri;
}
@Override

View File

@ -258,6 +258,14 @@ public final class CommonHelper {
return new ArgsParseResult(conf, classpath, jvmArgs, mainClass, mainModule, jarFile, args);
}
public static <K, V> V multimapFirstOrNullValue(K key, Map<K, List<V>> params) {
List<V> list = params.getOrDefault(key, Collections.emptyList());
if (list.isEmpty()) {
return null;
}
return list.getFirst();
}
public record ArgsParseResult(LaunchOptions.ModuleConf conf, List<String> classpath, List<String> jvmArgs, String mainClass, String mainModule, String jarFile, List<String> args) {
}

View File

@ -0,0 +1,29 @@
package pro.gravit.utils.helper;
import java.net.URI;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.*;
public class QueryHelper {
public static Map<String, List<String>> splitUriQuery(URI uri) {
var query = uri.getRawQuery();
if (query == null) {
return Collections.emptyMap();
}
Map<String, List<String>> params = new HashMap<>();
String[] split = query.split("&");
for (String qParams : split) {
String[] splitParams = qParams.split("=");
List<String> strings = params.computeIfAbsent(URLDecoder.decode(splitParams[0], StandardCharsets.UTF_8),
k -> new ArrayList<>(1));
strings.add(URLDecoder.decode(splitParams[1], StandardCharsets.UTF_8));
}
return params;
}
public static String encodeFormPair(String key, String value) {
return URLEncoder.encode(key, StandardCharsets.UTF_8) + "=" + URLEncoder.encode(value, StandardCharsets.UTF_8);
}
}