Hashing
Introdução
A facade Hash
do Laravel fornece a encriptação de senha segura do Bcrypt e Argon2 para armazenar as senhas do usuário. Se você estiver usando um dos Kit Inicializador de Aplicação Laravel, o Bcrypt será usado por padrão para registro e autenticação.
O bcrypt é uma ótima opção para fazer hash de senhas porque seu "fator trabalho" é ajustável, o que significa que o tempo que se leva para gerar um hash pode ser aumentado conforme a potência do hardware aumenta. Quando fazemos hash de senha, devemos ir com calma. Quanto mais tempo um algoritmo demora para fazer hash de uma senha, mais tempo os usuários maliciosos demoram para gerar a "rainbow tables" de todos os possíveis valores de hash de string que podem ser usados em ataques de força bruta contra aplicativos.
Configuração
Por padrão, o Laravel utiliza o bcrypt
como driver de hashamento ao criptografar dados. No entanto, vários outros drivers de hashamento são suportados, incluindo Argon2 e argon2id.
Você pode especificar o driver de hash da sua aplicação usando a variável de ambiente HASH_DRIVER
. Mas se você quer personalizar todas as opções do driver de hash do Laravel, você deve publicar o arquivo de configuração completo de hashing
usando o comando config:publish
do Artisan.
php artisan config:publish hashing
Uso Básico
Criptografia de senhas
Você pode hashear uma senha chamando o método make
da facade Hash
:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
class PasswordController extends Controller
{
/**
* Atualize a senha do usuário.
*/
public function update(Request $request): RedirectResponse
{
// Valide o novo comprimento da senha...
$request->user()->fill([
'password' => Hash::make($request->newPassword)
])->save();
return redirect('/profile');
}
}
Ajustando o fator de trabalho do bcrypt
Se você estiver usando o algoritmo Bcrypt, o método make
permite que você gerencie o fator de trabalho do algoritmo usando a opção rounds
; contudo, o fator de trabalho padrão gerenciado pelo Laravel é aceitável para a maioria das aplicações.
$hashed = Hash::make('password', [
'rounds' => 12,
]);
Ajustando o Fator de Trabalho do Argon 2
Se estiver usando o algoritmo Argon2, o método make
permite gerenciar o fator de trabalho do algoritmo com as opções memory
, time
e threads
; no entanto, os valores padrão gerenciados pelo Laravel são aceitáveis para a maioria das aplicações:
$hashed = Hash::make('password', [
'memory' => 1024,
'time' => 2,
'threads' => 2,
]);
NOTA
Para mais informações sobre essas opções, por favor, veja a documentação oficial do PHP sobre o hash de Argon (https://secure.php.net/manual/pt_BR/function.password-hash.php).
Verificando se uma Senha Combina com um Hash
O método check
fornecido pelo facade Hash
permite verificar se uma determinada string de texto corresponde a um determinado hash.
if (Hash::check('plain-text', $hashedPassword)) {
// As senhas correspondem...
}
Determine se uma Senha Precisa Ser Re-escrita
O método needsRehash
fornecido pela facade Hash
permite que você determine se o fator de trabalho usado pelo hasher mudou desde que a senha foi encriptada. Algumas aplicações escolhem executar essa verificação durante o processo de autenticação da aplicação:
if (Hash::needsRehash($hashed)) {
$hashed = Hash::make('plain-text');
}
Verificação de Algoritmos Hash
Para evitar manipulação de algoritmo de hash, o método Hash::check
do Laravel verificará primeiro se o hash fornecido foi gerado usando o algoritmo de hash selecionado pela aplicação. Se os algoritmos forem diferentes, uma exceção RuntimeException
será lançada.
Aqui está o comportamento esperado para a maioria das aplicações, onde o algoritmo de hash não deve ser alterado e diferentes algoritmos podem indicar um ataque malicioso. No entanto, se você precisar suportar vários algoritmos de hash dentro da sua aplicação, como quando migrando de um algoritmo para outro, você pode desativar a verificação do algoritmo de hash ao definir a variável de ambiente HASH_VERIFY
para false
:
HASH_VERIFY=false