Hashing

简介

Laravel 自带的 Hash facade 提供了采用 Bcrypt 加密算法的加密方式,用于存储用户密码。如果你正在使用 Laravel app 中自带的 AuthController 控制器(controller),它将自动为注册和验证过程采用 Bcrypt 算法。

对于加密密码来说,Bcrypt 是一个非常好的选择,因为它的 “加密系数(work factor)” 是可调整的,这就意味着,即便计算机硬件能力在逐步提升,通过调整 “加密系数”,计算一个哈希所消耗的时间也会随着提升,就是说破解的难度不会因为计算能力的提升而降低。

关于加密方面的知识,推荐看一看这篇文章:http://www.williamlong.info/archives/3224.html

基本用法

通过调用 Hash facade 中的 make 方法即可对密码进行加密:

<?php

namespace App\Http\Controllers;

use Hash;
use App\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
    /**
     * Update the password for the user.
     *
     * @param  Request  $request
     * @param  int  $id
     * @return Response
     */
    public function updatePassword(Request $request, $id)
    {
        $user = User::findOrFail($id);

        // Validate the new password length...

        $user->fill([
            'password' => Hash::make($request->newPassword)
        ])->save();
    }
}

另外,你还可以直接使用全局作用域中的 bcrypt 辅助函数:

bcrypt('plain-text');

根据哈希值校验密码

check 方法帮你检查一个纯文本字符串是否是一个哈希值。然而,如果你正在使用 Laravel 中自带AuthController,你就不需要直接调用这个函数了,因为 AuthController 已经自动帮你调用这个方法了:

if (Hash::check('plain-text', $hashedPassword)) {
    // The passwords match...
}

检查密码是否需要重新加密

needsRehash 函数帮助你检查自从密码被加密之后,加密系数(work factor)是否被改变了:

if (Hash::needsRehash($hashed)) {
    $hashed = Hash::make('plain-text');
}