crypt

(PHP 4, PHP 5, PHP 7, PHP 8)

cryptHash unidirecional de string

Warning

Esta função (ainda) não é compatível com dados binários!

Descrição

crypt(#[\SensitiveParameter] string $string, string $salt): string

crypt() retorna uma string com hash usando o algorimo padrão do Unix baseado em DES ou algortimos alternativos. password_verify() é compatível com crypt(). Portanto, hashes de senhas criados por crypt() podem ser usados com password_verify().

Antes do PHP 8.0.0, o parâmetro salt era opcional. Entretanto, crypt() criava um hash fraco sem salt e emitia um erro do tipo E_NOTICE. Certifique-se de especificar um sal forte o suficiente para uma melhor segurança de dados.

password_hash() usa um hash forte, gera um sal forte e aplica arredondamentos apropriados automaticamente. password_hash() é um empacotador simples de crypt() e compatível com hashes de senhas existentes. O uso de password_hash() é encorajado.

O tipo de hash é disparado pelo argumento salt (sal). Se nenhum sal for fornecido, o PHP irá gerar automaticamente um sal padrão de 2 caracteres (DES) ou de 12 caracteres (MD5), dependendo da disponibilidade de crypt() MD5. O PHP define uma constante de nome CRYPT_SALT_LENGTH que indica o comprimento máximo de sal permitido pelos hashes disponíveis.

A função crypt() padrão baseada em DES retorna o sal como os 2 primeiros caracteres da saída. Ela também somente usa os primeiros 8 caracteres da string, portanto strings mais longas que começam com os mesmos 8 caracteres irão gerar o mesmo resultado (quando o mesmo sal é usado).

Os seguintes tipos de hash são suportados:

  • CRYPT_STD_DES - Hash padrão baseado em DES com sal de 2 caracteres do conjunto "./0-9A-Za-z". Usar caracteres inválidos no sal irá causar falha na função crypt().
  • CRYPT_EXT_DES - Hash estendido baseado em DEX. O "sal" é uma string de 9 caracteres que consiste de um "_" seguido por 4 caracteres de contagem de iteração e 4 caracteres de sal. Cada string de 4 caracteres é codificada em 24 bits, os caracteres menos significativos primeiro. Os valores 0 a 63 são codificados como ./0-9A-Za-z. Usar caracteres inválidos no sal irá causar falha na função crypt().
  • CRYPT_MD5 - Hash MD5 com sal de 12 caracteres iniciando com $1$
  • CRYPT_BLOWFISH - Hash Blowfish com o sal desta forma: "$2a$", "$2x$" ou "$2y$", um parâmetro de custo de 2 dígitos, "$", e 22 caracteres do conjunto "./0-9A-Za-z". Usar caracteres fora deste conjunto no sal fará com que crypt() retorne uma string de comprimento zero. O parâmetro de custo de 2 dígitos é o logaritmo base 2 da contagem de iteração para o algortimo de hash baseado em Blowfish subjacente e precisa estar no intervalo 04-31. Valores fora deste intervalo causarão falha na função crypt(). Hashes "$2x$" são potencialmente fracas; hashes "$2a$" são compatíveis e mitigam esta fraqueza. Para novas hashes, "$2y$" deve ser usada.
  • CRYPT_SHA256 - Hash SHA-256 com sal de 16 caracteres prefixados com $5$. Se a string do sal iniciar com 'rounds=<N>$', o valor numérico de N é usado para indicar quantas rodadas do hash devem ser executadas, bem parecido com o parâmetro de custo do Blowfish. O número padrão de rodadas é 5000, existe um mínimo de 1.000 e um máximo de 999.999.999. Qualquer seleção de N fora deste intervalo será truncado ao limite mais próximo.
  • CRYPT_SHA512 - Hash SHA-512 com sal de 16 caracteres prefixados com $6$. Se a string do sal iniciar com 'rounds=<N>$', o valor numérico de N é usado para indicar quantas rodadas do hash devem ser executadas, bem parecido com o parâmetro de custo do Blowfish. O número padrão de rodadas é 5000, existe um mínimo de 1.000 e um máximo de 999.999.999. Qualquer seleção de N fora deste intervalo será truncado ao limite mais próximo.

Parâmetros

string

A string cujo hash será calculado.

Caution

Usar o algortimo CRYPT_BLOWFISH fará com que o parâmetro string seja truncado para um comprimento máximo de 72 bytes.

salt

Uma string de sal para servir como base para a operação de hash. Se não fornecido, o comportamento é definido pela implementação do algoritmo e pode levar a resultados inesperados.

Valor Retornado

Retorna o hash da string ou uma string mais curta que 13 caracteres que seja garantidamente diferente do sal em caso de falha.

Warning

Ao validar senhas, uma função de comparação de strings que não seja vulnerável a ataques de temporização deve ser usada para comparar a saída de crypt() ao hash conhecido anteriormente. O PHP fornece a função hash_equals() para este propósito.

Registro de Alterações

Versão Descrição
8.0.0 O parâmetro salt não é mais opcional.

Exemplos

Example #1 Exemplos de crypt()

<?php
$user_input = 'rasmuslerdorf';
$hashed_password = '$6$rounds=1000000$NJy4rIPjpOaU$0ACEYGg/aKCY3v8O8AfyiO7CTfZQ8/W231Qfh2tRLmfdvFD6XfHk12u6hMr9cYIA4hnpjLNSTRtUwYr9km9Ij/';

// Valida um hash existente criado por crypt() de forma compatível com software não-PHP.
if (hash_equals($hashed_password, crypt($user_input, $hashed_password))) {
   echo "Senha verificada!";
}
?>

Notas

Note: Não existe função de descriptografia, já que crypt() usa um algoritmo unidirecional.

Veja Também

  • hash_equals() - Timing attack safe string comparison
  • password_hash() - Cria um hash de senha
  • A página do manual Unix para a função crypt() para mais informação