使用SHA512散列

时间:2019-06-11 13:26:10

标签: laravel api

我有一个名为smsmo的Api端点表,而Models Class是Smsmo,具有以下字段:

Smsmo:

customer code varchar(30),
customer phone varchar(30),
customer name varchar(30),
customer address varchar(30),
customer hash varchar(300)

在尝试保存或更新时,这些字段(电话,代码,姓名)将被哈希到哈希字段中。

hash = name + code + phone

我已经拥有这些Api:

ApiController:

public function indexSmsmo()
{
    $smsmos = Smsmo::all();
    return response()->json(['success' => true,'data'=>$smsmos], $this->successStatus);

}   

public function showSmsmo($id)
{
    $smsmo = Smsmo::find($id);

    if (is_null($smsmo)) {
        return $this->sendError('SMS Outgoing not found.');
    }        
    return response()->json(['success' => true,'data'=>$smsmo], $this->successStatus);
}    

public function storeSmsmo(Request $request)
{
    $smsmo = Smsmo::create($request->all());
    return response()->json(['success' => $smsmo], $this-> successStatus);
}    

public function editSmsmo($id)
{
    $smsmo = Smsmo::find($id);
    return response()->json(['success' => true,'data'=>$smsmo], $this->successStatus);
}

public function updateSmsmo(Request $request, $id)
{
    $smsmo = Smsmo::find($id);
    $smsmo = $smsmo->update($request->all());
    return response()->json(['success' => true,'data'=>$smsmo], $this->successStatus);
}

public function deleteSmsmo($id)
{
    $smsmo = Smsmo::find($id)->delete();
}

那么在发送端点之前,如何使用SHA512和上面的函数进行哈希处理。

2 个答案:

答案 0 :(得分:2)

您可以为此使用 Laravel Mutator

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Smsmo extends Model
{
    /**
     * Set the hash attribute.
     *
     * @param  string  $value
     * @return void
     */

    public function setHashAttribute($value)
    {
        $hash = $this->phone.$this->code.$this->name;
        $this->attributes['hash'] = hash('sha512', $hash, false);
    }
}

无需更改控制器功能。

此处是文档,以获取更多详细信息。 https://laravel.com/docs/5.8/eloquent-mutators

答案 1 :(得分:1)

PHP具有built-in hash()函数,该函数涵盖了包括SHA-512在内的许多算法,因此这样的方法应该可以工作:

public function storeSmsmo(Request $request)
{
    $smsmo = new Smsmo;
    $smsmo->fill($request->all());
    $smsmo->hash = hash('sha512', $smsmo->name.$smsmo->code.$smsmo->phone);
    $smsmo->save();
    return response()->json(['success' => $smsmo], $this-> successStatus);
}    

public function updateSmsmo(Request $request, $id)
{
    $smsmo = Smsmo::find($id);
    $smsmo->fill($request->all());
    $smsmo->hash = hash('sha512', $smsmo->name.$smsmo->code.$smsmo->phone);
    $smsmo->save();
    return response()->json(['success' => true,'data'=>$smsmo], $this->successStatus);
}

或者,您可以通过延长模型生命周期来提高代码的可重用性:

class Smsmo extends Model
{
    ...
    public static function boot()
    {
        parent::boot();

        static::saving(function ($model){
            $model->hash = hash('sha512', $model->name.$model->code.$model->phone);
        });
    }
    ...
}

简而言之,在保存static::saving()模型之前,将始终执行您在Smsmo中定义的任何内容。通过这种方法,您无需在控制器中进行任何更改。