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

Tutorial di base PHP

Tutorial avanzato PHP

PHP & MySQL

Manuale di riferimento PHP

Uso e esempio della funzione password_hash() in PHP

PHP密码散列算法

La funzione password_hash() viene utilizzata per creare l'hash della password.

Richiesta di versione PHP: PHP 5 >= 5.5.0, PHP 7

Sintassi

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

password_hash() utilizza un algoritmo di hash a senso unico abbastanza forte per creare l'hash della password. password_hash() è compatibile con crypt(). Pertanto, l'hash di password creato da crypt() può anche essere utilizzato con password_hash().

Algoritmi supportati attualmente:

  • PASSWORD_DEFAULT - Usa l'algoritmo bcrypt (predefinito in PHP 5.5.0).      Attenzione, questo costante cambierà man mano che PHP aggiunge aggiornamenti con algoritmi di maggiore intensità.      Quindi, la lunghezza del risultato generato da questo costante potrebbe cambiare in futuro.      Pertanto, la colonna che memorizza i risultati nel database può superare i 60 caratteri (meglio 255 caratteri).

  • PASSWORD_BCRYPT - Usa CRYPT_BLOWFISH crea l'hash.      Questo produrrà un hash compatibile con crypt() utilizzando "$2y$".      Il risultato sarà una stringa di 60 caratteri, o tornerà FALSE.

  • PASSWORD_ARGON2I - Crea l'hash utilizzando l'algoritmo di hash Argon2.

Opzioni supportate da PASSWORD_BCRYPT:

  • salt(stringa) - Fornire manualmente il sale (salt) per l'hash di password. Questo eviterà la generazione automatica del sale.

    Omettendo questo valore, password_hash() genererà automaticamente un sale casuale per ogni hash di password. Questa è una modalità intenzionale.

    Attenzione: l'opzione di valore di sale (salt) è stata abbandonata (deprecated) da PHP 7.0.0. Ora è meglio scegliere di utilizzare il sale predefinito generato.

  • cost (intero) - Rappresenta il costo utilizzato dall'algoritmo. Nella pagina crypt() ci sono esempi di valori di costo.

    Se omesso, il valore predefinito è 10. Questo costo è un buon livello di partenza, ma potrebbe essere aumentato in base alla propria hardware.

Opzioni supportate da PASSWORD_ARGON2I:

  • memory_cost (integer) - La massima memoria utilizzata per calcolare l'hash Argon2 (unità: byte). Valore predefinito: PASSWORD_ARGON2_DEFAULT_MEMORY_COST.

  • time_cost (integer) - Il numero massimo di tempo utilizzato per calcolare l'hash Argon2. Valore predefinito: PASSWORD_ARGON2_DEFAULT_TIME_COST.

  • threads (integer) - Il numero massimo di thread utilizzati per calcolare l'hash Argon2. Valore predefinito: PASSWORD_ARGON2_DEFAULT_THREADS.

Spiegazione dei parametri:

  • password: un valore di hash creato da password_hash().

  • algo: un costante di algoritmo di password utilizzato per indicare l'algoritmo durante l'hash della password.

  • options: un array associativo che contiene le opzioni. Al momento supporta due opzioni: salt, la stringa di disturbo aggiunta durante l'hash della password, e cost, che indica il numero di livelli ricorsivi dell'algoritmo. Esempi di questi valori si possono trovare nella pagina crypt().

    Se omesso, verrà utilizzato un valore di sale casuale e cost predefiniti.

Valore di ritorno

Restituisce la password hashata, o FALSE in caso di fallimento.

Esempio online

<?php
/**
 * Vogliamo utilizzare l'algoritmo di hash predefinito per hashare le password
 * Al momento è BCRYPT e produrrà un risultato di 60 caratteri.
 *
 * Attenzione, con il passare del tempo, l'algoritmo predefinito potrebbe cambiare,
 * Quindi lo spazio di archiviazione necessario deve essere superiore a 60 caratteri (255 caratteri sono buoni)
 */
echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT);
?>

输出结果为:

$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a
<?php
/**
 * In questo caso, abbiamo aumentato il cost di BCRYPT a 12.
 * Attenzione, siamo già passati a generare sempre 60 caratteri.
 */
$options = [
    'cost' => 12,
];
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options);
?>

输出结果为:

$2y$12$QjSH496pcT5CEbzjD/vtVeH03tfHKFy36d4J0Ltp3lRtee9HDxY3K

Esempio 3

Esempio di impostazione manuale del valore di sale

<?php
/**
 * Attenzione, il valore di sale qui è generato casualmente.
 * Non utilizzare mai un valore di sale fisso o non generato casualmente.
 *
 * Nella maggior parte dei casi, può essere lasciato a password_hash generate automaticamente il valore di sale casuale.
 */
$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 "适当的成本找到: " . $cost;
?>

输出结果为:

适当的成本找到: 10

示例5

使用Argon2实例:

<?php
echo 'Argon2散列: ' . password_hash('rasmuslerdorf', PASSWORD_ARGON2I);
?>

输出结果为:

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

PHP密码散列算法