Why is php's password_hash so slow?

后端 未结 3 633
有刺的猬
有刺的猬 2021-02-14 21:13

I am using password_hash for password encryption. However there is a strange question, password_hash cost very long time. Here is a sample code. this c

3条回答
  •  春和景丽
    2021-02-14 21:29

    The default algorithm for password_hash, bcrypt, is designed to be slow.

    http://en.wikipedia.org/wiki/Key_stretching

    In cryptography, key stretching refers to techniques used to make a possibly weak key, typically a password or passphrase, more secure against a brute force attack by increasing the time it takes to test each possible key. Passwords or passphrases created by humans are often short or predictable enough to allow password cracking. Key stretching makes such attacks more difficult.

    http://en.wikipedia.org/wiki/Rainbow_table#Defense_against_rainbow_tables

    Another technique that helps prevent precomputation attacks is key stretching. When stretching is used, the salt, password, and a number of intermediate hash values are run through the underlying hash function multiple times to increase the computation time required to hash each password. For instance, MD5-Crypt uses a 1000 iteration loop that repeatedly feeds the salt, password, and current intermediate hash value back into the underlying MD5 hash function. The user's password hash is the concatenation of the salt value (which is not secret) and the final hash. The extra time is not noticeable to users because they have to wait only a fraction of a second each time they log in. On the other hand, stretching reduces the effectiveness of a brute-force attacks in proportion to the number of iterations because it reduces the number of computations an attacker can perform in a given time frame. This principle is applied in MD5-Crypt and in bcrypt. It also greatly increases the time needed to build a precomputed table, but in the absence of salt, this needs only be done once.

    A full second is probably a little long - you could experiment with dropping $cost by one or two to bring it more to something like a tenth of a second, which will retain the effective protection while making the delay unnoticeable to your users.

提交回复
热议问题