English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial Básico do PHP

Tutorial Avançado do PHP

PHP & MySQL

Manual de Referência do PHP

Uso e exemplo da função password_hash() do PHP

PHP 密码散列算法

A função password_hash() é usada para criar um hash da senha.

Requisitos de versão do PHP: PHP 5 >= 5.5.0, PHP 7

Sintaxe

string password_hash (string $password, int $algo[, array $options])

password_hash() cria um hash da senha usando um algoritmo de hash unidirecional de força suficiente. password_hash() é compatível com crypt(). Portanto, o hash de senha criado pelo crypt() também pode ser usado com password_hash().

Algoritmos suportados atualmente:

  • PASSWORD_DEFAULT - Usar o algoritmo bcrypt (PHP 5.5.0 por padrão).      Atenção, este constante mudará à medida que o PHP adicionar atualizações com algoritmos mais fortes.      Portanto, o uso deste constante para gerar o comprimento do resultado pode mudar no futuro.      Portanto, a coluna que armazena o resultado no banco de dados pode ter mais60 caracteres (melhor255caracteres).

  • PASSWORD_BCRYPT - Usar CRYPT_BLOWFISH Cria um hash com o algoritmo.      Isso gerará compatibilidade com o uso de "$2do crypt() com y$".      O resultado será 6Uma string de 0 caracteres, ou será retornada em caso de falha FALSE.

  • PASSWORD_ARGON2I - 使用 Argon2 Cria um hash a partir do algoritmo de hash.

Opções suportadas pelo PASSWORD_BCRYPT:

  • salt(string) - Forneça manualmente o valor de sal do hash de senha. Isso evitará a geração automática do sal.

    Após omitir este valor, o password_hash() gerará automaticamente um valor de sal aleatório para cada hash de senha. Esta é uma prática intencional.

    Atenção: a opção de sal (salt) foi descontinuada a partir do PHP 7.0.0 foi descontinuado (deprecated). Atualmente, é melhor simplesmente usar o valor de sal gerado aleatoriamente.

  • cost (integer) - representa o cost usado pelo algoritmo. Exemplos de valores de cost podem ser encontrados na página crypt().

    omitido, o valor padrão é 10. Este cost é uma boa base, mas talvez possa ser aumentado conforme a situação da sua hardware.

PASSWORD_ARGON2Opções suportadas por I:

  • memory_cost (integer) - calcular Argon2 memória máxima permitida no hash (em bytes byte). Valor padrão: PASSWORD_ARGON2_DEFAULT_MEMORY_COST.

  • time_cost (integer) - calcular Argon2 tempo máximo permitido no hash. Valor padrão: PASSWORD_ARGON2_DEFAULT_TIME_COST.

  • threads (integer) - calcular Argon2 número máximo de threads permitidas no hash. Valor padrão: PASSWORD_ARGON2_DEFAULT_THREADS.

Descrição dos parâmetros:

  • password: um valor de hash criado pelo password_hash().

  • algo: um constante de algoritmo de senha usada para indicar o algoritmo ao criar o hash de senha.

  • options: um array associativo contendo opções. Atualmente suporta duas opções: salt, a string de扰乱 adicionada ao hash de senha, e cost, que indica o número de camadas recursivas do algoritmo. Exemplos desses valores podem ser encontrados na página crypt().

    omitido, usará valor de sal aleatório e cost padrão.

Retorno

retorna a senha hashada ou FALSE em caso de falha.

Exemplo online

<?php
/**
 * nós queremos usar o algoritmo de hash padrão para criptografar a senha
 * Atualmente é BCRYPT, e produzirá 60 caractere(s) de resultado.
 *
 * Atenção, com o passar do tempo, o algoritmo padrão pode mudar,
 * portanto, o espaço de armazenamento necessário deve ser maior que 60 palavra(s)255palavra correta)
 */
echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT);
?>

输出结果为:

$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a
<?php
/**
 * Neste caso, aumentamos o cost do BCRYPT para 12.
 * Atenção,我们已经切换到了,将始终产生 60 caractere(s).
 */
$options = [
    'cost' => 12,
];
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options);
?>

输出结果为:

$2y$12$QjSH496pcT5CEbzjD/vtVeH03tfHKFy36d4J0Ltp3lRtee9HDxY3K

示例 3

Exemplo de configuração manual de valor de sal

<?php
/**
 * Atenção, o valor de sal aqui é gerado aleatoriamente.
 * Nunca utilize um valor de sal fixo ou não gerado aleatoriamente.
 *
 * 在绝大多数情况下,可以让 password_hash generate 为你自动产生随机盐值
 */
$options = [
    'cost' => 11,
    'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM),
];
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options);
?>

输出结果为:

$2y$11$q5MkhSBtlsJcNEVsYh64a.aCluzHnGog7TQAKVmQwO9C8xb.t89F.

示例 4

寻找最佳 cost 的 password_hash() 实例

<?php
/**
 * 这个实例对服务器做了基准测试(benchmark),检测服务器能承受多高的 cost
 * 在不明显拖慢服务器的情况下可以设置最高的值
 * 8-10 是个不错的底线,在服务器够快的情况下,越高越好。
 * 以下代码目标为 ≤ 50 毫秒(milliseconds),
 * 适合系统处理交互登录。
 */
$timeTarget = 0.05; // 50 毫秒(milliseconds) 
 
$cost = 8;
do {
    $cost++;
    $start = microtime(true);
    password_hash("test", PASSWORD_BCRYPT, ["cost" => $cost]);
    $end = microtime(true);
} while (($end - $start) < $timeTarget);
 
echo "Appropriate Cost Found: " . $cost;
?>

输出结果为:

Appropriate Cost Found: 10

示例 5

使用 Argon2 实例:

<?php
echo 'Argon2 hash: $argon . password_hash('rasmuslerdorf', PASSWORD_ARGON2I);
?>

输出结果为:

Argon2 hash: $argon2i$v=19$m=1024,t=2,p=2$YzJBSzV4TUhkMzc3d3laeg$zqU/1IN0/AogfP4cmSJI1vc8lpXRW9/S0sYY2i2jHT0

PHP 密码散列算法