MySQLPacketHandshakeResponse41.createWithNativePassword constructor
MySQLPacketHandshakeResponse41.createWithNativePassword({
- required String username,
- required String password,
- required MySQLPacketInitialHandshake initialHandshakePayload,
Cria uma resposta de handshake utilizando o método nativo de autenticação (mysql_native_password).
username
: Nome do usuário.password
: Senha do usuário.initialHandshakePayload
: Pacote do handshake inicial enviado pelo servidor.
A função concatena as partes do desafio (challenge) enviado pelo servidor, calcula os hashes SHA1 necessários e aplica a operação XOR para gerar os dados de autenticação.
Implementation
factory MySQLPacketHandshakeResponse41.createWithNativePassword({
required String username,
required String password,
required MySQLPacketInitialHandshake initialHandshakePayload,
}) {
// Concatena a parte 1 do desafio com os 12 primeiros bytes da parte 2
final challenge = initialHandshakePayload.authPluginDataPart1 +
initialHandshakePayload.authPluginDataPart2!.sublist(0, 12);
// Verifica se o desafio possui 20 bytes, conforme especificado.
assert(challenge.length == 20);
// Converte a senha para bytes (UTF-8)
final passwordBytes = utf8.encode(password);
// Calcula a resposta de autenticação:
// authResponse = xor(sha1(password), sha1(challenge + sha1(sha1(password))))
final authData = xor(
sha1(passwordBytes),
sha1(challenge + sha1(sha1(passwordBytes))),
);
return MySQLPacketHandshakeResponse41(
capabilityFlags: _supportedCapabitilies,
maxPacketSize: 50 * 1024 * 1024,
authPluginName: initialHandshakePayload.authPluginName!,
characterSet: initialHandshakePayload.charset,
authResponse: authData,
username: username,
);
}