比如说用户注册后,后台给用户密码MD5加密了在存入数据库,用户在登入的时候输入的密码要与数据库保存的密码对比。我想问的是,用户登入时,后台要把密码用MD5加密后才能与数据库的密码比较吗?
对,确实如此。
实际上MD5加密方式现在并不安全,更好的方式是采用sha1或者使用php提供的password_hash
函数
stringpassword_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){thrownewRuntimeException('Bcrypthashingnotsupported.');}return$hash;
同一个密文,每次生成的hash值是不同的,可以很好地避免撞库攻击等,生成的密码类似于下面这种格式
$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a
顺便提醒你一下,md5很容易被反向对比出密码。
所以你做md5的时候,最好用$md5=md5($password.$rand_str)
其中$rand_str
是一个该应用独有的字符串。
这样,就算你的数据库暴露了,也不会泄露用户的密码。
这种技巧叫加盐哈希
,$rand_str
就是盐
如果不是历史原因,php5.5以上推荐password_hash
使用,如laravel
publicfunctionmake($value,array$options=array()){$cost=isset($options['rounds'])?$options['rounds']:$this->rounds;$hash=password_hash($value,PASSWORD_BCRYPT,array('cost'=>$cost));if($hash===false){thrownewRuntimeException("Bcrypthashingnotsupported.");}return$hash;}publicfunctioncheck($value,$hashedValue,array$options=array()){returnpassword_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的加密方式
的确是这样的,加密的方式有很多,像加盐啊等等。。