1
resposta

Autenticação usando outro banco

Estou usando o Laravel na versão 5.4 e preciso fazer a autenticação de um sistema usando outra tabela e que não usa o código (chave primária) e a senha está criptografada usando a função PASSWORD do MySQL, e não a user que o próprio Laravel disponibiliza, a tabela que precisa ser usada para a autenticação tem milhares de registros já existentes nela, como fazer? Que arquivos mudar?

1 resposta

Oi Eder, tudo bom?

Esses casos são bem delicados mesmo. Normalmente, decriptografar os dados no banco pode não ser uma opção.

Talvez a melhor abordagem seja mudar a forma com que o laravel criptografa as senhas. Aqui você encontra um exemplo de como mudar a criptografia para uma propria.

Dei uma pesquisada e encontrei aqui um exemplo da criptografia que o mysql usa na função PASSWORD:

// The following is free for any use provided credit is given where due.
// This code comes with NO WARRANTY of any kind, including any implied warranty.

/**
 * MySQL "OLD_PASSWORD()" AKA MySQL323 HASH FUNCTION
 * This is the password hashing function used in MySQL prior to version 4.1.1
 * By Rev. Dustin Fineout 10/9/2009 9:12:16 AM
**/
function mysql_old_password_hash($input, $hex = true)
{
  $nr = 1345345333; $add = 7; $nr2 = 0x12345671; $tmp = null;
  $inlen = strlen($input);
  for ($i = 0; $i < $inlen; $i++) {
    $byte = substr($input, $i, 1);
    if ($byte == ' ' || $byte == "\t") continue;
    $tmp = ord($byte);
    $nr ^= ((($nr & 63) + $add) * $tmp) + (($nr << 8) & 0xFFFFFFFF);
    $nr2 += (($nr2 << 8) & 0xFFFFFFFF) ^ $nr;
    $add += $tmp;
  }
  $out_a = $nr & ((1 << 31) - 1);
  $out_b = $nr2 & ((1 << 31) - 1);
  $output = sprintf("%08x%08x", $out_a, $out_b);
  if ($hex) return $output;
  return hex_hash_to_bin($output);
} //END function mysql_old_password_hash

/**
 * MySQL "PASSWORD()" AKA MySQLSHA1 HASH FUNCTION
 * This is the password hashing function used in MySQL since version 4.1.1
 * By Rev. Dustin Fineout 10/9/2009 9:36:20 AM
**/
function mysql_password_hash($input, $hex = true)
{
  $sha1_stage1 = sha1($input, true);
  $output = sha1($sha1_stage1, !$hex);
  return $output;
} //END function mysql_password_hash

/**
 * Computes each hexidecimal pair into the corresponding binary octet.
 * Similar to mysql hex2octet function.
**/
function hex_hash_to_bin($hex)
{
  $bin = "";
  $len = strlen($hex);
  for ($i = 0; $i < $len; $i += 2) {
    $byte_hex = substr($hex, $i, 2);
    $byte_dec = hexdec($byte_hex);
    $byte_char = chr($byte_dec);
    $bin .= $byte_char;
  }
  return $bin;
} //END function hex_hash_to_bin

A função mysql_old_password_hash é referente as versões anteriores ao mysql 4.1.1 =)

Utilizando o algoritmo certo para seu caso, acredito que você consiga fazer com que o laravel utilize a mesma criptografia do banco.