MySQLPacketHandshakeResponse41.createWithNativePassword constructor

MySQLPacketHandshakeResponse41.createWithNativePassword({
  1. required String username,
  2. required String password,
  3. 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,
  );
}