Current Location: Home> Latest Articles> password_needs_rehash does not take effect? It may be that the hash algorithm is set up incorrectly

password_needs_rehash does not take effect? It may be that the hash algorithm is set up incorrectly

gitbox 2025-05-28

In PHP, the password_needs_rehash function is used to determine whether a password hash value needs to be rehashed using the currently specified algorithm and options. When the system's hashing policy changes (such as upgrading from bcrypt to argon2id , or changing the cost factor), it can help us quietly upgrade the old hash to the new standard when the user logs in. However, developers may encounter situations where "looks unproductive" when using this function. Let’s analyze why password_needs_rehash may not take effect, and focus on explaining the most common reason: the hash algorithm setting error.

1. Review of basic functions

 $hash = password_hash('mypassword', PASSWORD_DEFAULT);
$options = ['cost' => 12];

if (password_needs_rehash($hash, PASSWORD_DEFAULT, $options)) {
    $hash = password_hash('mypassword', PASSWORD_DEFAULT, $options);
}

This logic means: if the original hash does not conform to the current algorithm or parameters, it will be rehashed.

2. Common misunderstandings: Hash algorithm setting errors

The core basis of password_needs_rehash is the algorithm and parameters you pass in . If you set these parameters incorrectly, it will fail to judge the difference , and thus return false incorrectly, thinking that no update is required.

Example 1: Falsely thought that PASSWORD_DEFAULT will be updated automatically

Many developers think that as long as you use PASSWORD_DEFAULT , PHP will automatically upgrade the algorithm for you. For example:

 $oldHash = password_hash('mypassword', PASSWORD_BCRYPT); // Use explicitly bcrypt

Then you change it to:

 $options = ['cost' => 12];
$needsRehash = password_needs_rehash($oldHash, PASSWORD_DEFAULT, $options);

The problem is: PASSWORD_DEFAULT is currently (as of PHP 8.3) still PASSWORD_BCRYPT , then password_needs_rehash does not find the algorithm inconsistency because it believes that the algorithm is still bcrypt. At this point you may expect it to return true , but it returns false .

3. Rehashing will not be triggered when the cost parameters have not changed.

Many people will pass cost parameters (such as cost ), but if the same cost is already used in the original hash value, the function will not be judged as "rehashing is required". Even if you write ['cost' => 10] manually, and it was originally 10, the function will return false in this case.

 $hash = password_hash('mypassword', PASSWORD_BCRYPT, ['cost' => 10]);
$needsRehash = password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 10]);
// The result is still false,Because there is no change

4. How to correctly determine whether updates are needed

To ensure that your hashing strategy is correctly perceived when changes occur, the following practices are recommended:

  1. Clearly set up new algorithms (such as upgrading from PASSWORD_BCRYPT to PASSWORD_ARGON2ID );

  2. Explicitly update cost parameters, such as increasing cost from 10 to 12;

  3. If possible, maintain the original hash policy as a configuration item for unified upgrades.

 $hash = password_hash('mypassword', PASSWORD_ARGON2ID);
$needsRehash = password_needs_rehash($hash, PASSWORD_ARGON2ID, [
    'memory_cost' => 1<<17,
    'time_cost' => 4,
    'threads' => 2
]);

V. Debugging Suggestions

If you suspect password_needs_rehash is not working as expected, you can output the hash string during debugging to check. Hash prefixes usually represent the algorithm used, for example:

  • $2y$ means bcrypt

  • $argon2id$ means argon2id

You can check whether the new algorithm is actually used by observing these prefixes.

In addition, the current configuration can be output through logging, or a background management page can be created to check the hash policy currently used.

6. Conclusion

password_needs_rehash is a very practical function that can help us smooth the transition password hashing strategy, but it is not "magic". It depends on the parameters you provide to judge the differences. If set up wrong, it may think that no update is required even if the hash is outdated. Therefore, keeping the hashing strategy configuration clear and controllable is the key to ensuring the effectiveness of the function.

Ensuring that your code correctly determines when rehash is needed is the first step in the evolution of password security. For online projects, it is recommended to configure hash policies as centralized and regularly evaluate the upgrade plan to ensure that security policies do not stay in the past.