- * Internally, the BCrypt library in {@link BCrypt.Hasher#hash(int, byte[])} uses the following: - * {@code Bytes.random(16, secureRandom).encodeUtf8();} - *
- * Because our {@link EncryptionMethod} interface works with {@code String} types we need to make sure that the
- * generated bytes in the salt are suitable for conversion into a String, such that calling String#getBytes will
- * yield the same number of bytes again. Thus, we are forced to limit the range of characters we use. Ideally we'd
- * only have to pass the salt in its encoded form so that we could make use of the entire "spectrum" of values,
- * which proves difficult to achieve with the underlying BCrypt library. However, the salt needs to be generated
- * manually only for testing purposes; production code should always hash passwords using
- * {@link EncryptionMethod#computeHash(String, String)}, which internally may represent salts in more suitable
- * formats.
*
* @return the salt for a BCrypt hash
*/
public static String generateSalt() {
return RandomStringUtils.generateLowerUpper(BYTES_IN_SALT);
}
+
+ // BCrypt modified-base64 alphabet (OpenBSD variant)
+ private static final byte[] B64_INDEX;
+ static {
+ B64_INDEX = new byte[128];
+ Arrays.fill(B64_INDEX, (byte) -1);
+ String table = "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+ for (int i = 0; i < table.length(); i++) {
+ B64_INDEX[table.charAt(i)] = (byte) i;
+ }
+ }
+
+ /**
+ * Decodes a BCrypt-modified-base64 encoded salt (22 chars) into raw bytes (16 bytes).
+ * The BCrypt alphabet differs from standard base64 and uses a slightly different character set.
+ *
+ * @param saltB64 the 22-character BCrypt-base64 encoded salt
+ * @return 16 raw salt bytes
+ */
+ public static byte[] decodeSalt(String saltB64) {
+ byte[] out = new byte[BYTES_IN_SALT];
+ for (int i = 0, j = 0; i < saltB64.length() - 1 && j < BYTES_IN_SALT; ) {
+ int c0 = b64Char(saltB64, i++);
+ int c1 = b64Char(saltB64, i++);
+ out[j++] = (byte) ((c0 << 2) | (c1 >> 4));
+ if (j >= BYTES_IN_SALT || i >= saltB64.length()) break;
+ int c2 = b64Char(saltB64, i++);
+ out[j++] = (byte) (((c1 & 0x0f) << 4) | (c2 >> 2));
+ if (j >= BYTES_IN_SALT || i >= saltB64.length()) break;
+ int c3 = b64Char(saltB64, i++);
+ out[j++] = (byte) (((c2 & 0x03) << 6) | c3);
+ }
+ return out;
+ }
+
+ private static int b64Char(String s, int pos) {
+ char c = s.charAt(pos);
+ int v = (c < 128) ? B64_INDEX[c] : -1;
+ if (v == -1) {
+ throw new IllegalArgumentException("Invalid BCrypt base64 character '" + c + "'");
+ }
+ return v;
+ }
}
diff --git a/authme-core/src/main/java/fr/xephi/authme/security/crypts/Ipb4.java b/authme-core/src/main/java/fr/xephi/authme/security/crypts/Ipb4.java
index e176d0aab..41ab05f36 100644
--- a/authme-core/src/main/java/fr/xephi/authme/security/crypts/Ipb4.java
+++ b/authme-core/src/main/java/fr/xephi/authme/security/crypts/Ipb4.java
@@ -1,15 +1,11 @@
package fr.xephi.authme.security.crypts;
-import at.favre.lib.crypto.bcrypt.BCrypt;
-import at.favre.lib.crypto.bcrypt.IllegalBCryptFormatException;
import fr.xephi.authme.security.crypts.description.HasSalt;
import fr.xephi.authme.security.crypts.description.Recommendation;
import fr.xephi.authme.security.crypts.description.SaltType;
import fr.xephi.authme.security.crypts.description.Usage;
import fr.xephi.authme.util.RandomStringUtils;
-import static java.nio.charset.StandardCharsets.UTF_8;
-
/**
* Implementation for Ipb4 (Invision Power Board 4).
@@ -22,21 +18,16 @@
@HasSalt(value = SaltType.TEXT, length = BCryptHasher.SALT_LENGTH_ENCODED)
public class Ipb4 implements EncryptionMethod {
- private BCryptHasher bCryptHasher = new BCryptHasher(BCrypt.Version.VERSION_2A, 13);
+ private BCryptHasher bCryptHasher = new BCryptHasher("2a", 13);
@Override
public String computeHash(String password, String salt, String name) {
- // Since the radix64-encoded salt is necessary to be stored separately as well, the incoming salt here is
- // radix64-encoded (see #generateSalt()). This means we first need to decode it before passing into the
- // bcrypt hasher... We cheat by inserting the encoded salt into a dummy bcrypt hash so that we can parse it
- // with the BCrypt utilities.
- // This method (with specific salt) is only used for testing purposes, so this approach should be OK.
-
- String dummyHash = "$2a$10$" + salt + "3Cfb5GnwvKhJ20r.hMjmcNkIT9.Uh9K";
+ // The salt here is the 22-char BCrypt-modified-base64 encoded salt (see #generateSalt).
+ // This method (with specific salt) is only used for testing purposes.
try {
- BCrypt.HashData parseResult = BCrypt.Version.VERSION_2A.parser.parse(dummyHash.getBytes(UTF_8));
- return bCryptHasher.hashWithRawSalt(password, parseResult.rawSalt);
- } catch (IllegalBCryptFormatException |IllegalArgumentException e) {
+ byte[] rawSalt = BCryptHasher.decodeSalt(salt);
+ return bCryptHasher.hashWithRawSalt(password, rawSalt);
+ } catch (IllegalArgumentException e) {
throw new IllegalStateException("Cannot parse hash with salt '" + salt + "'", e);
}
}
@@ -45,7 +36,7 @@ public String computeHash(String password, String salt, String name) {
public HashedPassword computeHash(String password, String name) {
HashedPassword hash = bCryptHasher.hash(password);
- // 7 chars prefix, then 22 chars which is the encoded salt, which we need again
+ // 7 chars prefix ($2a$XX$), then 22 chars which is the encoded salt, which we need again
String salt = hash.getHash().substring(7, 29);
return new HashedPassword(hash.getHash(), salt);
}
diff --git a/authme-core/src/main/java/fr/xephi/authme/security/crypts/Pbkdf2.java b/authme-core/src/main/java/fr/xephi/authme/security/crypts/Pbkdf2.java
index 2be6ad156..03745542b 100644
--- a/authme-core/src/main/java/fr/xephi/authme/security/crypts/Pbkdf2.java
+++ b/authme-core/src/main/java/fr/xephi/authme/security/crypts/Pbkdf2.java
@@ -1,12 +1,12 @@
package fr.xephi.authme.security.crypts;
import com.google.common.primitives.Ints;
-import de.rtner.misc.BinTools;
import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.output.ConsoleLoggerFactory;
import fr.xephi.authme.security.crypts.description.Recommendation;
import fr.xephi.authme.security.crypts.description.Usage;
import fr.xephi.authme.settings.Settings;
+import org.bouncycastle.util.encoders.Hex;
import javax.inject.Inject;
@@ -24,7 +24,7 @@ public class Pbkdf2 extends AbstractPbkdf2 {
@Override
public String computeHash(String password, String salt, String name) {
return "pbkdf2_sha256$" + numberOfRounds + "$" + salt + "$"
- + BinTools.bin2hex(deriveKey(password, salt.getBytes(), numberOfRounds, 64));
+ + Hex.toHexString(deriveKey(password, salt.getBytes(), numberOfRounds, 64)).toUpperCase();
}
@Override
@@ -38,7 +38,7 @@ public boolean comparePassword(String password, HashedPassword hashedPassword, S
logger.warning("Cannot read number of rounds for Pbkdf2: '" + line[1] + "'");
return false;
}
- return verifyKey(password, line[2].getBytes(), iterations, BinTools.hex2bin(line[3]));
+ return verifyKey(password, line[2].getBytes(), iterations, Hex.decode(line[3]));
}
@Override
diff --git a/authme-core/src/main/java/fr/xephi/authme/security/crypts/Pbkdf2Django.java b/authme-core/src/main/java/fr/xephi/authme/security/crypts/Pbkdf2Django.java
index a0877cd4b..8dda3de15 100644
--- a/authme-core/src/main/java/fr/xephi/authme/security/crypts/Pbkdf2Django.java
+++ b/authme-core/src/main/java/fr/xephi/authme/security/crypts/Pbkdf2Django.java
@@ -1,27 +1,29 @@
package fr.xephi.authme.security.crypts;
import com.google.common.primitives.Ints;
-import de.rtner.security.auth.spi.PBKDF2Engine;
-import de.rtner.security.auth.spi.PBKDF2Parameters;
import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.output.ConsoleLoggerFactory;
import fr.xephi.authme.security.crypts.description.AsciiRestricted;
+import org.bouncycastle.crypto.generators.PKCS5S2ParametersGenerator;
+import org.bouncycastle.crypto.digests.SHA256Digest;
+import org.bouncycastle.crypto.params.KeyParameter;
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
import java.util.Base64;
@AsciiRestricted
public class Pbkdf2Django extends HexSaltedMethod {
private static final int DEFAULT_ITERATIONS = 24000;
+ private static final int HASH_BYTES = 32;
private final ConsoleLogger logger = ConsoleLoggerFactory.get(Pbkdf2Django.class);
@Override
public String computeHash(String password, String salt, String name) {
- String result = "pbkdf2_sha256$" + DEFAULT_ITERATIONS + "$" + salt + "$";
- PBKDF2Parameters params = new PBKDF2Parameters("HmacSHA256", "ASCII", salt.getBytes(), DEFAULT_ITERATIONS);
- PBKDF2Engine engine = new PBKDF2Engine(params);
-
- return result + Base64.getEncoder().encodeToString(engine.deriveKey(password, 32));
+ byte[] derived = derive(password, salt.getBytes(StandardCharsets.US_ASCII), DEFAULT_ITERATIONS);
+ return "pbkdf2_sha256$" + DEFAULT_ITERATIONS + "$" + salt + "$"
+ + Base64.getEncoder().encodeToString(derived);
}
@Override
@@ -35,12 +37,10 @@ public boolean comparePassword(String password, HashedPassword hashedPassword, S
logger.warning("Cannot read number of rounds for Pbkdf2Django: '" + line[1] + "'");
return false;
}
-
String salt = line[2];
- byte[] derivedKey = Base64.getDecoder().decode(line[3]);
- PBKDF2Parameters params = new PBKDF2Parameters("HmacSHA256", "ASCII", salt.getBytes(), iterations, derivedKey);
- PBKDF2Engine engine = new PBKDF2Engine(params);
- return engine.verifyKey(password);
+ byte[] expected = Base64.getDecoder().decode(line[3]);
+ byte[] computed = derive(password, salt.getBytes(StandardCharsets.US_ASCII), iterations);
+ return MessageDigest.isEqual(computed, expected);
}
@Override
@@ -48,4 +48,9 @@ public int getSaltLength() {
return 12;
}
+ private static byte[] derive(String password, byte[] saltBytes, int iterations) {
+ PKCS5S2ParametersGenerator gen = new PKCS5S2ParametersGenerator(new SHA256Digest());
+ gen.init(password.getBytes(StandardCharsets.US_ASCII), saltBytes, iterations);
+ return ((KeyParameter) gen.generateDerivedMacParameters(HASH_BYTES * 8)).getKey();
+ }
}
diff --git a/authme-core/src/main/java/fr/xephi/authme/security/crypts/Wbb4.java b/authme-core/src/main/java/fr/xephi/authme/security/crypts/Wbb4.java
index a55a2d48b..ab11c7a7a 100644
--- a/authme-core/src/main/java/fr/xephi/authme/security/crypts/Wbb4.java
+++ b/authme-core/src/main/java/fr/xephi/authme/security/crypts/Wbb4.java
@@ -1,7 +1,5 @@
package fr.xephi.authme.security.crypts;
-import at.favre.lib.crypto.bcrypt.BCrypt;
-import at.favre.lib.crypto.bcrypt.IllegalBCryptFormatException;
import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.output.ConsoleLoggerFactory;
import fr.xephi.authme.security.crypts.description.HasSalt;
@@ -9,19 +7,19 @@
import fr.xephi.authme.security.crypts.description.SaltType;
import fr.xephi.authme.security.crypts.description.Usage;
+import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;
import static fr.xephi.authme.security.HashUtils.isEqual;
import static fr.xephi.authme.security.crypts.BCryptHasher.BYTES_IN_SALT;
import static fr.xephi.authme.security.crypts.BCryptHasher.SALT_LENGTH_ENCODED;
-import static java.nio.charset.StandardCharsets.UTF_8;
@Recommendation(Usage.RECOMMENDED)
@HasSalt(value = SaltType.TEXT, length = SALT_LENGTH_ENCODED)
public class Wbb4 implements EncryptionMethod {
private final ConsoleLogger logger = ConsoleLoggerFactory.get(Wbb4.class);
- private BCryptHasher bCryptHasher = new BCryptHasher(BCrypt.Version.VERSION_2A, 8);
+ private BCryptHasher bCryptHasher = new BCryptHasher("2a", 8);
private SecureRandom random = new SecureRandom();
@Override
@@ -35,17 +33,22 @@ public HashedPassword computeHash(String password, String name) {
@Override
public String computeHash(String password, String salt, String name) {
- return hashInternal(password, salt.getBytes(UTF_8));
+ return hashInternal(password, salt.getBytes(StandardCharsets.UTF_8));
}
@Override
public boolean comparePassword(String password, HashedPassword hashedPassword, String name) {
+ String hash = hashedPassword.getHash();
+ // BCrypt hash format: $2a$<2-digit-cost>$<22-char-salt><31-char-hash>
+ // Salt starts at index 7 ($2a$08$ = 7 chars), is 22 chars long
+ if (hash.length() < 29) {
+ return false;
+ }
try {
- BCrypt.HashData hashData = BCrypt.Version.VERSION_2A.parser.parse(hashedPassword.getHash().getBytes(UTF_8));
- byte[] salt = hashData.rawSalt;
+ byte[] salt = BCryptHasher.decodeSalt(hash.substring(7, 29));
String computedHash = hashInternal(password, salt);
- return isEqual(hashedPassword.getHash(), computedHash);
- } catch (IllegalBCryptFormatException | IllegalArgumentException e) {
+ return isEqual(hash, computedHash);
+ } catch (Exception e) {
logger.logException("Invalid WBB4 hash:", e);
}
return false;
diff --git a/authme-core/src/main/java/fr/xephi/authme/security/crypts/XfBCrypt.java b/authme-core/src/main/java/fr/xephi/authme/security/crypts/XfBCrypt.java
index 749b5f57f..109b3d118 100644
--- a/authme-core/src/main/java/fr/xephi/authme/security/crypts/XfBCrypt.java
+++ b/authme-core/src/main/java/fr/xephi/authme/security/crypts/XfBCrypt.java
@@ -1,7 +1,5 @@
package fr.xephi.authme.security.crypts;
-import at.favre.lib.crypto.bcrypt.BCrypt;
-
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -11,7 +9,7 @@ public class XfBCrypt extends BCryptBasedHash {
private static final Pattern HASH_PATTERN = Pattern.compile("\"hash\";s.*\"(.*)?\"");
XfBCrypt() {
- super(new BCryptHasher(BCrypt.Version.VERSION_2A, 10));
+ super(new BCryptHasher("2a", 10));
}
/**
diff --git a/authme-core/src/main/java/fr/xephi/authme/settings/SettingsWarner.java b/authme-core/src/main/java/fr/xephi/authme/settings/SettingsWarner.java
index c1141d388..b1419f153 100644
--- a/authme-core/src/main/java/fr/xephi/authme/settings/SettingsWarner.java
+++ b/authme-core/src/main/java/fr/xephi/authme/settings/SettingsWarner.java
@@ -3,12 +3,9 @@
import fr.xephi.authme.AuthMe;
import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.output.ConsoleLoggerFactory;
-import fr.xephi.authme.security.HashAlgorithm;
-import fr.xephi.authme.security.crypts.Argon2;
import fr.xephi.authme.settings.properties.EmailSettings;
import fr.xephi.authme.settings.properties.PluginSettings;
import fr.xephi.authme.settings.properties.RestrictionSettings;
-import fr.xephi.authme.settings.properties.SecuritySettings;
import javax.inject.Inject;
@@ -53,13 +50,6 @@ public void logWarningsForMisconfigurations() {
logger.warning("Warning: Session timeout needs to be positive in order to work!");
}
- // Check if argon2 library is present and can be loaded
- if (settings.getProperty(SecuritySettings.PASSWORD_HASH).equals(HashAlgorithm.ARGON2)
- && !Argon2.isLibraryLoaded()) {
- logger.warning("WARNING!!! You use Argon2 Hash Algorithm method but we can't find the Argon2 "
- + "library on your system! See https://github.com/AuthMe/AuthMeReloaded/wiki/Argon2-as-Password-Hash");
- authMe.stopOrUnload();
- }
}
}
diff --git a/authme-core/src/main/resources/plugin.yml b/authme-core/src/main/resources/plugin.yml
index 53f391a32..caa3a3b42 100644
--- a/authme-core/src/main/resources/plugin.yml
+++ b/authme-core/src/main/resources/plugin.yml
@@ -27,9 +27,7 @@ libraries:
- com.mysql:mysql-connector-j:${dependencies.mysql-connector-j.version}
- org.mariadb.jdbc:mariadb-java-client:${dependencies.mariadb-java-client.version}
- org.postgresql:postgresql:${dependencies.postgresql.version}
- - de.rtner:PBKDF2:${dependencies.pbkdf2.version}
- - de.mkammerer:argon2-jvm-nolibs:${dependencies.argon2-jvm-nolibs.version}
- - at.favre.lib:bcrypt:${dependencies.bcrypt.version}
+ - org.bouncycastle:bcprov-jdk18on:${dependencies.bcprov.version}
- com.warrenstrange:googleauth:${dependencies.googleauth.version}
- ch.jalu:configme:${dependencies.configme.version}
- org.bstats:bstats-bukkit:${dependencies.bstats.version}
diff --git a/authme-core/src/test/java/fr/xephi/authme/security/HashAlgorithmIntegrationTest.java b/authme-core/src/test/java/fr/xephi/authme/security/HashAlgorithmIntegrationTest.java
index 13147dcb8..fa94ef48a 100644
--- a/authme-core/src/test/java/fr/xephi/authme/security/HashAlgorithmIntegrationTest.java
+++ b/authme-core/src/test/java/fr/xephi/authme/security/HashAlgorithmIntegrationTest.java
@@ -3,7 +3,6 @@
import ch.jalu.injector.Injector;
import ch.jalu.injector.InjectorBuilder;
import fr.xephi.authme.TestHelper;
-import fr.xephi.authme.security.crypts.Argon2;
import fr.xephi.authme.security.crypts.EncryptionMethod;
import fr.xephi.authme.security.crypts.HashedPassword;
import fr.xephi.authme.security.crypts.description.Recommendation;
@@ -64,10 +63,6 @@ public void shouldBeAbleToInstantiateEncryptionAlgorithms() {
// given / when / then
for (HashAlgorithm algorithm : HashAlgorithm.values()) {
if (!HashAlgorithm.CUSTOM.equals(algorithm) && !HashAlgorithm.PLAINTEXT.equals(algorithm)) {
- if (HashAlgorithm.ARGON2.equals(algorithm) && !Argon2.isLibraryLoaded()) {
- System.out.println("[WARNING] Cannot find argon2 library, skipping integration test");
- continue;
- }
EncryptionMethod method = injector.createIfHasDependencies(algorithm.getClazz());
if (method == null) {
fail("Could not create '" + algorithm.getClazz() + "' - forgot to provide some class?");
diff --git a/authme-core/src/test/java/fr/xephi/authme/security/crypts/Argon2Test.java b/authme-core/src/test/java/fr/xephi/authme/security/crypts/Argon2Test.java
index a1736148f..0a46003c7 100644
--- a/authme-core/src/test/java/fr/xephi/authme/security/crypts/Argon2Test.java
+++ b/authme-core/src/test/java/fr/xephi/authme/security/crypts/Argon2Test.java
@@ -1,22 +1,16 @@
package fr.xephi.authme.security.crypts;
-import static org.junit.jupiter.api.Assumptions.assumeTrue;
-
/**
* Test for {@link Argon2}.
*/
public class Argon2Test extends AbstractEncryptionMethodTest {
- private static final boolean IS_LIBRARY_LOADED = Argon2.isLibraryLoaded();
-
public Argon2Test() {
super(new Argon2(),
"$argon2i$v=19$m=65536,t=2,p=1$dOP8NiXsPTcMgzI4Z8Rbew$ShdowtoTEWTL5UTFz1UgQOigb9JOlm4ZxWPA6WbIeUw", // password
"$argon2i$v=19$m=65536,t=2,p=1$amZHbPfgc5peKd/4w1AI1g$Q2PUiOVw47TACijP57U0xf7QfiZ00HV4eFzMDA6yKRE", // PassWord1
"$argon2i$v=19$m=65536,t=2,p=1$58v7dWNn9/bpD00QLzSebw$7cMC7p0qceE3Mgf2yQp4X7c+UkO9oyJwQ7S6XTBubNs", // &^%te$t?Pw@_
"$argon2i$v=19$m=65536,t=2,p=1$93OSU71DgBOzpmhti7+6rQ$sSSI6QQQdoG9DlGwLjYz576kTek89nwr9CyNpy6bsL0"); // âË_3(íù*
-
- assumeTrue(IS_LIBRARY_LOADED, "Argon2 library is not loaded - skipping test");
}
@Override
diff --git a/authme-folia/src/main/resources/plugin.yml b/authme-folia/src/main/resources/plugin.yml
index 47cf2235a..e206119f6 100644
--- a/authme-folia/src/main/resources/plugin.yml
+++ b/authme-folia/src/main/resources/plugin.yml
@@ -28,9 +28,7 @@ libraries:
- com.mysql:mysql-connector-j:${dependencies.mysql-connector-j.version}
- org.mariadb.jdbc:mariadb-java-client:${dependencies.mariadb-java-client.version}
- org.postgresql:postgresql:${dependencies.postgresql.version}
- - de.rtner:PBKDF2:${dependencies.pbkdf2.version}
- - de.mkammerer:argon2-jvm-nolibs:${dependencies.argon2-jvm-nolibs.version}
- - at.favre.lib:bcrypt:${dependencies.bcrypt.version}
+ - org.bouncycastle:bcprov-jdk18on:${dependencies.bcprov.version}
- com.warrenstrange:googleauth:${dependencies.googleauth.version}
- ch.jalu:configme:${dependencies.configme.version}
- org.bstats:bstats-bukkit:${dependencies.bstats.version}
diff --git a/authme-paper/src/main/resources/plugin.yml b/authme-paper/src/main/resources/plugin.yml
index dd864cb84..a001d537f 100644
--- a/authme-paper/src/main/resources/plugin.yml
+++ b/authme-paper/src/main/resources/plugin.yml
@@ -27,9 +27,7 @@ libraries:
- com.mysql:mysql-connector-j:${dependencies.mysql-connector-j.version}
- org.mariadb.jdbc:mariadb-java-client:${dependencies.mariadb-java-client.version}
- org.postgresql:postgresql:${dependencies.postgresql.version}
- - de.rtner:PBKDF2:${dependencies.pbkdf2.version}
- - de.mkammerer:argon2-jvm-nolibs:${dependencies.argon2-jvm-nolibs.version}
- - at.favre.lib:bcrypt:${dependencies.bcrypt.version}
+ - org.bouncycastle:bcprov-jdk18on:${dependencies.bcprov.version}
- com.warrenstrange:googleauth:${dependencies.googleauth.version}
- ch.jalu:configme:${dependencies.configme.version}
- org.bstats:bstats-bukkit:${dependencies.bstats.version}
diff --git a/authme-spigot-1.21/src/main/resources/plugin.yml b/authme-spigot-1.21/src/main/resources/plugin.yml
index dd864cb84..a001d537f 100644
--- a/authme-spigot-1.21/src/main/resources/plugin.yml
+++ b/authme-spigot-1.21/src/main/resources/plugin.yml
@@ -27,9 +27,7 @@ libraries:
- com.mysql:mysql-connector-j:${dependencies.mysql-connector-j.version}
- org.mariadb.jdbc:mariadb-java-client:${dependencies.mariadb-java-client.version}
- org.postgresql:postgresql:${dependencies.postgresql.version}
- - de.rtner:PBKDF2:${dependencies.pbkdf2.version}
- - de.mkammerer:argon2-jvm-nolibs:${dependencies.argon2-jvm-nolibs.version}
- - at.favre.lib:bcrypt:${dependencies.bcrypt.version}
+ - org.bouncycastle:bcprov-jdk18on:${dependencies.bcprov.version}
- com.warrenstrange:googleauth:${dependencies.googleauth.version}
- ch.jalu:configme:${dependencies.configme.version}
- org.bstats:bstats-bukkit:${dependencies.bstats.version}
diff --git a/authme-spigot-legacy/src/main/resources/plugin.yml b/authme-spigot-legacy/src/main/resources/plugin.yml
index dd864cb84..a001d537f 100644
--- a/authme-spigot-legacy/src/main/resources/plugin.yml
+++ b/authme-spigot-legacy/src/main/resources/plugin.yml
@@ -27,9 +27,7 @@ libraries:
- com.mysql:mysql-connector-j:${dependencies.mysql-connector-j.version}
- org.mariadb.jdbc:mariadb-java-client:${dependencies.mariadb-java-client.version}
- org.postgresql:postgresql:${dependencies.postgresql.version}
- - de.rtner:PBKDF2:${dependencies.pbkdf2.version}
- - de.mkammerer:argon2-jvm-nolibs:${dependencies.argon2-jvm-nolibs.version}
- - at.favre.lib:bcrypt:${dependencies.bcrypt.version}
+ - org.bouncycastle:bcprov-jdk18on:${dependencies.bcprov.version}
- com.warrenstrange:googleauth:${dependencies.googleauth.version}
- ch.jalu:configme:${dependencies.configme.version}
- org.bstats:bstats-bukkit:${dependencies.bstats.version}
diff --git a/authme-tools/pom.xml b/authme-tools/pom.xml
index e86fc708d..d2919c8ef 100644
--- a/authme-tools/pom.xml
+++ b/authme-tools/pom.xml
@@ -74,18 +74,8 @@