W3docs

crypt()

A função crypt() realiza hashing unidirecional de uma string em PHP. Conheça a sintaxe, os formatos de salt e como verificar senhas.

A função PHP crypt() realiza hashing unidirecional de uma string. "Unidirecional" significa que você pode transformar uma senha em um hash, mas não pode reverter o hash para a senha original — o que é exatamente o que se deseja ao armazenar senhas. Esta página aborda a sintaxe, os formatos de salt que selecionam cada algoritmo de hashing, como verificar um hash armazenado e por que o código moderno deve preferir password_hash().

Sintaxe

crypt(string $string, string $salt = ""): string

A função aceita dois parâmetros:

  • $string — o texto de entrada que você deseja hashear.
  • $salt — uma string que seleciona o algoritmo de hashing e fornece bytes aleatórios que fazem com que senhas idênticas produzam hashes diferentes. O salt é opcional, mas omiti-lo é inseguro (um aviso é emitido desde o PHP 8.0): sempre passe um salt explícito.

O valor de retorno é a string com hash. Os primeiros caracteres do resultado codificam o salt e o algoritmo, tornando o hash autodescritivo — você pode armazená-lo como está e crypt() saberá depois como reproduzi-lo.

Um exemplo básico

php— editable, runs on the server

Aqui passamos uma string e um salt para crypt(), e ele retorna o hash. Com o salt "ab", a saída é o hash DES padrão:

abJnggxhB/yWI

Observe que os dois primeiros caracteres da saída (ab) são o próprio salt — é assim que crypt() lembra qual algoritmo e salt produziram o hash.

Formatos de salt e algoritmos

A forma do salt indica ao crypt() qual algoritmo usar. Este é o aspecto mais importante a entender sobre a função:

Prefixo do saltAlgoritmoNotas
(2 chars, sem $)DESLegado, fraco — apenas os primeiros 8 caracteres da senha são considerados. Evite.
$1$MD5Antigo; não use para novas senhas.
$5$SHA-256
$6$SHA-512Forte; suporta um custo rounds=.
$2y$Blowfish (bcrypt)O algoritmo recomendado para crypt(). Formato: $2y$<cost>$<22-char salt>.

Um exemplo com bcrypt e custo explícito de 10:

<?php
$hash = crypt("password123", '$2y$10$usesomesillystringforsalt$');
echo $hash;
?>

A saída começa com $2y$10$, registrando o algoritmo e o custo para que o hash possa ser verificado posteriormente:

$2y$10$usesomesillystringforeSNzFqnuq1h/v0NITsGcb4b3qwzSfNIa

Verificando uma senha

Para verificar uma senha contra um hash armazenado, calcule o hash do candidato usando o hash armazenado como salt. crypt() lê o algoritmo e o salt de volta a partir desse hash, reproduzindo automaticamente os mesmos parâmetros:

php— editable, runs on the server

Saída:

Password is valid!

Use hash_equals() em vez de == para a comparação — ele executa em tempo constante e evita ataques de temporização que podem vazar informações sobre o hash.

Quando usar (e o que usar no lugar)

crypt() é uma ferramenta de baixo nível e legada. É fácil de usar incorretamente: um salt muito curto, o prefixo errado ou o formato DES obsoleto produzem hashes fracos. Para novo código, prefira os auxiliares de alto nível que encapsulam crypt() e cuidam da geração de salt e da seleção de algoritmo:

<?php
$hash = password_hash("password123", PASSWORD_DEFAULT);   // generates a strong bcrypt hash + random salt

if (password_verify("password123", $hash)) {
    echo "Password is valid!";
}
?>

password_hash() e password_verify() são a forma recomendada para armazenar e verificar senhas no PHP moderno. Recorra a crypt() apenas quando precisar interoperar com um sistema existente que já armazena hashes no formato crypt().

Para hashing simples sem relação com senhas (checksums, chaves de cache, ETags), consulte as funções md5() e sha1() — observe que essas não são adequadas para senhas. Para mais utilitários de string, consulte a referência de funções de string PHP.

Prática

Prática
Qual é o principal uso da função crypt() no PHP?
Qual é o principal uso da função crypt() no PHP?
Was this page helpful?