Using Md5 for password hash in Auth component of Cakephp 2.x

[亡魂溺海] 提交于 2019-11-28 09:51:29

问题


I have an existing website, built using CakePhp 1.3. In that website I have used MD5 algorithm for the password hash.

Now I want to upgrade my CakePhp version to 2.3.5, but I'm unable to use MD5 for the password hash.

I would like to know why I can't use MD5 in CakePhp 2.x. ?


回答1:


Don't use md5 for passwords

md5 is not an appropriate hashing algorithm for hashing passwords, don't use it. There are many, many references which explain why - including the php manual:

Why are common hashing functions such as md5() and sha1() unsuitable for passwords?

Hashing algorithms such as MD5, SHA1 and SHA256 are designed to be very fast and efficient. With modern techniques and computer equipment, it has become trivial to "brute force" the output of these algorithms, in order to determine the original input.

Because of how quickly a modern computer can "reverse" these hashing algorithms, many security professionals strongly suggest against their use for password hashing.

How to change the default hash algorithm

You can change the default hashing algorithm using setHash, a recommended hash algorithm for passwords is blowfish:

Security::setHash('blowfish');

How to handle existing passwords

If you really want to, you can just change setHash to use md5.

But that's not a good idea.

Don't compromise the security of a new/updated application just to accommodate the poor security of the old one. Instead of using the same hash algoritm (and salt) as the previous application you can use logic such as the following (pseudo-ish code):

$username = $this->data['User']['username'];
$plainText = $this->data['User']['password'];

$user = current($this->User->findByUsername($username));

Security::setHash('blowfish');
$blowfished = Security::hash($plainText, 'blowfish', $user['password']);

if ($blowfished === $user['password']) {
    return true; // user exists, password is correct
}

$oldSalt = Configure::read('configure.this');
$md5ed = Security::hash($plainText, 'md5', $oldSalt);

if ($md5ed === $user['password']) {
    $this->User->id = $user['id'];

    $blowfished = Security::hash($plainText);
    $this->User->saveField('password', $blowfished);

    return true; // user exists, password now updated to blowfish
}

return false; // user's password does not exist.

This kind of logic is not complex, and prevents the need to continue using a bad hash algorithm.




回答2:


I do not recommend the use of this code in any scenario, ever. MD5 is a horrible hashing algorithm for security as it is too resource-light to discourage cracking. It also has known vulnerabilities. Use bcrypt or SHA-512.

To do this, you can edit AppController.php like this:

<?php
// AppController.php

public function beforeFilter()
{
    Security::setHash('md5');
}
?>

However, this is not recommended as MD5 is a very poor password hashing algorithm. You're far better adding a function to allow users to login with existing md5 passwords, encouraging them to upgrade to the new hash, and not allowing any new users to set MD5 passwords.

If, instead you want to use a secure function like bcrypt, you can do the following:

<?php
// AppController.php

public function beforeFilter()
{
    Security::setHash('blowfish');
}
?>

When comparing plaintext values to hashes, you have to pass the original hash as the salt value in order to retain cost parameters etc:

$newHash = Security::hash($newPassword, 'blowfish', $storedPassword);


来源:https://stackoverflow.com/questions/16585222/using-md5-for-password-hash-in-auth-component-of-cakephp-2-x

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!