Что подразумевается под sha256-then-argon2id? - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь аутентифицировать пароли по хеш-записям, хранящимся в базе данных. Каждая запись выглядит примерно так. Пароль, который должен соответствовать этой записи: 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;
    }
}
...