php 用户密码MD5加密存入数据库问题//

比如说用户注册后,后台给用户密码MD5加密了在存入数据库,用户在登入的时候输入的密码要与数据库保存的密码对比。我想问的是,用户登入时,后台要把密码用MD5加密后才能与数据库的密码比较吗?

阅读 8.1k
10 个回答

对,确实如此。

实际上MD5加密方式现在并不安全,更好的方式是采用sha1或者使用php提供的password_hash函数

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

在Laravel框架中就是采用password_hash函数对密码进行加密

$cost = isset($options['rounds']) ? $options['rounds'] : $this->rounds;

$hash = password_hash($value, PASSWORD_BCRYPT, ['cost' => $cost]);

if ($hash === false) {
    throw new RuntimeException('Bcrypt hashing not supported.');
}

return $hash;

同一个密文,每次生成的hash值是不同的,可以很好地避免撞库攻击等,生成的密码类似于下面这种格式

$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a

顺便提醒你一下,md5很容易被反向对比出密码。

所以你做md5的时候,最好用 $md5 = md5($password . $rand_str) 其中$rand_str是一个该应用独有的字符串。

这样,就算你的数据库暴露了,也不会泄露用户的密码。

这种技巧叫加盐哈希, $rand_str就是盐

如果不是历史原因,php5.5以上推荐password_hash使用,如laravel

public function make($value, array $options = array())
    {
        $cost = isset($options['rounds']) ? $options['rounds'] : $this->rounds;

        $hash = password_hash($value, PASSWORD_BCRYPT, array('cost' => $cost));

        if ($hash === false)
        {
            throw new RuntimeException("Bcrypt hashing not supported.");
        }

        return $hash;
    }
public function check($value, $hashedValue, array $options = array())
    {
        return password_verify($value, $hashedValue);
    }

$password = Input::get('password_from_user'); 
$hash = Hash::make($password );//保存数据库

//对比
$input = 'password_from_user';
if(Hash::check($input, $hash)){
    
}

必须啊!MD5不可逆,所以登陆时肯定要把前台的密码也加密,然后和数据库对比,才能知道密码是否相同。不然怎么对比

如果不是历史原因,还是建议更换加密方式,低版本的话可以百度phpass类库,然后楼主问得是是否验证对吧,是的,库里查了和用户提交上来的密码,使用相同的加密方式然后对比一下就可以了

数据库存的就是加密后的密码。
保证用户的信息安全,是不能够存储明文密码的,所有的验证都是用的加密后的字串

对的,毕竟MD5算法是哈希算法的一种。一般情况下,前端传给后端的密码就是经过MD5加密后的密文。这样的话可能会更安全一点。不同的技术经理或经理要求可能不一样。

是的,但是现在好像流行用sha1加salt的加密方式

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题