Я пытаюсь аутентифицировать пароли по хеш-записям, хранящимся в базе данных. Каждая запись выглядит примерно так. Пароль, который должен соответствовать этой записи: p455W0rd
.
$sha256-then-argon2id$v=19$m=8192,t=20,p=4$kfIEEdKK46MWK1XPSotv4g$1nGvnXr+vtQWNeuKCmlqOMukorvRG40ypGcAlPI0IkU
После чтения большая часть этого кажется простой для понимания. Все параметры после первого достаточно очевидны. Но я не понимаю, что подразумевается под первым.
Я предположил, что sha256-then-argon2id
означало, что хеш пароля SHA-256 должен использоваться в качестве входа для функции argon2 вместо самого пароля. Это оказалось неверным. Я хотел бы понять смысл этой схемы хеширования паролей. Это кажется очень нерегулярным, и я не вижу никаких ответов онлайн.
PS Вот мой (ошибочный) код Java, основанный на том, что я предположил. Может быть, я просто делаю глупую ошибку где-то.
import org.bouncycastle.crypto.generators.Argon2BytesGenerator;
import org.bouncycastle.crypto.params.Argon2Parameters;
import org.bouncycastle.crypto.digests.SHA256Digest;
import java.nio.charset.Charset;
public class Argon2Hasher {
public static byte[] sha256ThenArgon2ID(String password,
Charset enc,
int version,
int mem,
int iter,
int par,
byte[] salt) {
// get SHA256(password)
SHA256Digest digest = new SHA256Digest();
for (byte b : password.getBytes(enc)) digest.update(b);
byte[] hash = new byte[digest.getDigestSize()];
digest.doFinal(hash, 0);
// get argon2id(hash)
Argon2BytesGenerator gen = new Argon2BytesGenerator();
gen.init(new Argon2Parameters.Builder(Argon2Parameters.ARGON2_id)
.withVersion(version)
.withMemoryAsKB(mem)
.withIterations(iter)
.withParallelism(par)
.withSalt(salt).build());
byte[] buffer = new byte[32];
gen.generateBytes(hash, buffer);
return buffer;
}
}