laravel 賬號密碼加密修改設(shè)計(jì)冀泻,crypt加密和hash加密總結(jié),適用前后端分離常侣,ios,安卓

由于項(xiàng)目的需要,博主需要做一個修改密碼的功能腔长,項(xiàng)目用到的是laravel框架袭祟,但是沒想到他里面的Hash::make()跟之前寫過的md5()有很大的差別,下面總結(jié)一下 ,laravel自帶Hash::make加密 規(guī)則默認(rèn)為AES-256-CBC捞附;框架設(shè)計(jì)為前后端分離巾乳,laravel做接口,前端node.js 鸟召,ios胆绊,Android

這里遇到的坑就是laravel框架中,每次hash的值都是不一致的欧募,跟之前寫過的md5不一樣压状,md5是唯一的,但是只要保存進(jìn)去了,就算hash以后的值是不一樣的种冬,但是都是代表一個東西的镣丑,比如說,你hash的是111111娱两,就算hash兩次的值不一致莺匠,但是并不會影響你的代碼邏輯的,只要正常判斷即可十兢,laravel不愧為排名第一的框架趣竣,果然很優(yōu)雅!:滴铩RB啤!

一宵呛、iosAES 加密解密

//AES加密

+(NSString*)encodeAESWith:(NSString*)str{

 if(!str) {

 return@"";

    }

NSString* key=AESKey;//密鑰

NSData*data=[str dataUsingEncoding:NSUTF8StringEncoding];//待加密字符轉(zhuǎn)為NSData型

 charkeyPtr[kKeySize+1];

    memset(keyPtr,0,sizeof(keyPtr));

    [keygetCString:keyPtrmaxLength:sizeof(keyPtr)encoding:NSUTF8StringEncoding];

    NSUIntegerdataLength = [datalength];

    size_tbufferSize = dataLength +kCCBlockSizeAES128;

 void*buffer =malloc(bufferSize);

    size_tnumBytesCrypted =0;

    NSData*initVector = [kInitVectordataUsingEncoding:NSUTF8StringEncoding];

    CCCryptorStatuscryptStatus =CCCrypt(kCCEncrypt,

                                         kCCAlgorithmAES128,

                                         kCCOptionPKCS7Padding,

                                         keyPtr,

                                         kCCBlockSizeAES128,

                                         initVector.bytes,

                                         [databytes],

                                         dataLength,

                                         buffer,

                                         bufferSize,

                                         &numBytesCrypted);

 if(cryptStatus ==kCCSuccess) {

        NSData*resultData=[NSDatadataWithBytesNoCopy:bufferlength:numBytesCrypted];

        NSString*result = [resultDatabase64EncodedStringWithOptions:0];

 returnresult;

    }

    free(buffer);

 return@"";

}

//AES解密

+ (NSString*)decodeAESString:(NSString*)aesEncodedString{

    if(!aesEncodedString){

        return@"";

    }

    NSData*contentData = [[NSDataalloc]initWithBase64EncodedString:aesEncodedStringoptions:NSDataBase64DecodingIgnoreUnknownCharacters];

    NSUIntegerdataLength = contentData.length;

    charkeyPtr[kKeySize+1];

    memset(keyPtr,0,sizeof(keyPtr));

    [AESKeygetCString:keyPtrmaxLength:sizeof(keyPtr)encoding:NSUTF8StringEncoding];

    size_tdecryptSize = dataLength +kCCBlockSizeAES128;

    void*decryptedBytes =malloc(decryptSize);

    size_tactualOutSize =0;

    NSData*initVector = [kInitVectordataUsingEncoding:NSUTF8StringEncoding];

    CCCryptorStatuscryptStatus =CCCrypt(kCCDecrypt,

                                          kCCAlgorithmAES128,

                                          kCCOptionPKCS7Padding,

                                          keyPtr,

                                          kKeySize,

                                          initVector.bytes,

                                          contentData.bytes,

                                          dataLength,

                                          decryptedBytes,

                                          decryptSize,

                                          &actualOutSize);

    if(cryptStatus ==kCCSuccess) {

        NSData*dataTemp = [NSDatadataWithBytesNoCopy:decryptedByteslength:actualOutSize];



        NSString*str = [[NSStringalloc]initWithData:dataTempencoding:NSUTF8StringEncoding];

        returnstr;

    }

    free(decryptedBytes);

    return@"";

}

二单匣、安卓/java加密 解密

package com.sdjn.quzg.utils.str;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class EncryptorUtils {
    public final static String KEYAES = "DJTggiIeOBu3blSX";
    public final static String IVAES = "2oFtRtKzfnkxLB18";

    public static String encrypt(String key, String initVector, String value) {
        try {
            IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
            SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");

            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);

            byte[] encrypted = cipher.doFinal(value.getBytes());
            System.out.println("encrypted string: " + Base64.getEncoder().encodeToString(encrypted));

            return Base64.getEncoder().encodeToString(encrypted);
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return null;
    }

    public static String decrypt(String key, String initVector, String encrypted) {
        try {
            IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
            SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");

            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
            cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);

            byte[] original = cipher.doFinal(Base64.getDecoder().decode(encrypted));

            return new String(original);
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return null;
    }

    public static String zgPwd(String pwd) {
        return encrypt(KEYAES, IVAES, pwd);
    }
}

三、前端使用crypto.js進(jìn)行加密

最近在使用Cookies加密保存數(shù)據(jù)的時候烤蜕,接觸到crypto封孙,使用還算簡單,在這里記錄一下讽营。

可以在這個GitHub的https://github.com/brix/crypto-js上下載該js虎忌,它可以單獨(dú)引入所需要加密方式的js;也可以引入一個crypto-js.js 這個文件橱鹏,它相當(dāng)于引入了所有的加密方式膜蠢,我使用的就是后者一次引入所有的加密文件,這個文件也不是很大莉兰,還可以接受挑围。

因?yàn)槲业男枨笫羌用芸赡妫哂幸欢ǖ陌踩?對安全性要求并不是特別高)糖荒,所以使用DES或AES即可杉辙,我用的是AES:

function getAesString(data,key,iv){//加密
    var key  = CryptoJS.enc.Utf8.parse(key);
    var iv   = CryptoJS.enc.Utf8.parse(iv);
    var encrypted =CryptoJS.AES.encrypt(data,key,
        {
            iv:iv,
            mode:CryptoJS.mode.CBC,
            padding:CryptoJS.pad.Pkcs7
        });
    return encrypted.toString();    //返回的是base64格式的密文
}
function getDAesString(encrypted,key,iv){//解密
    var key  = CryptoJS.enc.Utf8.parse(key);
    var iv   = CryptoJS.enc.Utf8.parse(iv);
    var decrypted =CryptoJS.AES.decrypt(encrypted,key,
        {
            iv:iv,
            mode:CryptoJS.mode.CBC,
            padding:CryptoJS.pad.Pkcs7
        });
    return decrypted.toString(CryptoJS.enc.Utf8);     
}

function getAES(data){ //加密
    var key  = 'DJTggiIeOBu3blSX';  //密鑰   可以修改,自定義
    var iv   = '2oFtRtKzfnkxLB18';      //偏移量   可以修改捶朵,自定義
    var encrypted =getAesString(data,key,iv); //密文
    var encrypted1 =CryptoJS.enc.Utf8.parse(encrypted);
    return encrypted;
}

function getDAes(data){//解密
    var key  = 'DJTggiIeOBu3blSX';  //密鑰  可以修改蜘矢,自定義
    var iv   = '2oFtRtKzfnkxLB18';  //偏移量  可以修改,自定義
    var decryptedStr =getDAesString(data,key,iv);
    return decryptedStr;
}

key和iv我們都可以更換综看,但是需要保證的是加解密的key和iv保持一致

四品腹、PHP端加密方法,放在PHP laravel Funtions.php 中

    /**
     * encode_crypt 加密固定key與iv偏移量
     * @author storm_fu
     * @date   2019/09/05
     * @param $encrypt
     * @return int|string
     */
    function encode_crypt($encrypt)
    {
        $key = ENV('CRYPT_KEY');//加密鑰匙  env文件中添加: CRYPT_KEY=DJTggiIeOBu3blSX  (可以修改红碑,自定義)
        $iv = ENV('CRYPT_IV');//偏移量      env文件中添加: CRYPT_IV=2oFtRtKzfnkxLB18  (可以修改舞吭,自定義)
        // 加密
        $encode = base64_encode(openssl_encrypt($encrypt,"AES-128-CBC",$key,true,$iv));
        if($encode){
            return $encode;
        }else{
            return false;
        }
    }

五、PHP端解密方法 ,放在PHP laravel Funtions.php 中

     /**
     * decode_crypt解密固定key與iv偏移量
     * @author storm_fu
     * @date   2019/09/05
     * @param $encrypt
     * @return int|string
     */
    function decode_crypt($encrypt)
    {
        $key = ENV('CRYPT_KEY');//解密鑰匙       env文件中添加: CRYPT_KEY=DJTggiIeOBu3blSX  (可以更改)

        $encrypt = base64_decode($encrypt);

        $iv = ENV('CRYPT_IV');//偏移量           env文件中添加: CRYPT_IV=2oFtRtKzfnkxLB18   (可以更改)

        $decrypt = openssl_decrypt($encrypt, 'AES-128-CBC', $key, true, $iv);
        if($decrypt){
            return $decrypt;
        }else{
            return false;
        }
    }


六羡鸥、laravel自帶Hash::make加密 規(guī)則默認(rèn)為AES-256-CBC

數(shù)據(jù)庫中的密碼使用Hash加密保存


<?php
namespace App\Service\Admin;

use App\Models\Admin\UserModel;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;   //需要引入

class UserService
{
    public static function s_add($param)
    {
        $data = [
            'username' => $param['mobile_phone'],
            'password' => Hash::make('000000'),
            'sex'      => $param['gender'],
            'phone'    => $param['mobile_phone']
        ];
         $userResult = UserModel::m_addUser($data);
    }
}


七蔑穴、laravel 用Hash::check解密

控制器層

<?php
namespace App\Http\Controllers\Admin;

use App\Service\Admin\UserService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class AuthController extends BaseController
{
    /**
     * 登錄
     * @author storm_fu
     * @param \Illuminate\Http\Request;
     * @return \Illuminate\Http\Response;
     */
    public function login(Request $request)
    {
        try {
            $param=$request->input();
            $param['username'] = $request->input('username','');
            $param['password'] = $request->input('password','');
            $response=UserService::getUser($param);
            return jsonResponse($response);
        } catch (QueryException $queryException) {
            return jsonResponse(['code'=>400,'msg'=>'登錄失敗']);
        }
    }
}

業(yè)務(wù)處理Service層

<?php

namespace App\Service\Admin;

use App\Models\Admin\UserModel;
use Illuminate\Support\Facades\Hash;     //**重點(diǎn)** 需要引入

class UserService
{
    public static function getUser($param)
    {
        $user = UserModel::getUser($param);     
        //前端解密
        $password = decode_crypt($param['password']);     //從前端獲取的加密密碼先進(jìn)行解密
        //檢查是否和數(shù)據(jù)庫中的密碼一致
        if (empty($user) || !Hash::check($password,$user['password'])) {
            return [
                'code' => 400,
                'msg' => '用戶名或密碼不正確'
            ];
        }else{
            return [
                'code' => 200,
                'msg' => '驗(yàn)證成功'
            ];
        }
    }
}

Model層

<?php

namespace App\Models\Admin;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;

class UserModel extends Model
{

   protected $table = 'jh_users';

   /**
    * 獲取用戶信息
    * @author storm_fu
    * @date   2019/09/05
    * @param $param
    * @return mixed
    */
   public static function getUser($param)
   {
       $user = self::where('username', $param['username'])->where('is_delete', 0)->first();

       return object_to_array($user);
   }
}

==這里遇到的坑就是laravel框架中,每次hash的值都是不一致的兄春,跟之前寫過的md5不一樣澎剥,md5是唯一的,但是只要保存進(jìn)去了赶舆,就算hash以后的值是不一樣的,但是都是代表一個東西的祭饭,比如說芜茵,你hash的是111111,就算hash兩次的值不一致倡蝙,但是并不會影響你的代碼邏輯的九串,只要正常判斷即可,laravel不愧為排名第一的框架寺鸥,果然很優(yōu)雅V砼ァ!5ńā烤低!==

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市笆载,隨后出現(xiàn)的幾起案子扑馁,更是在濱河造成了極大的恐慌,老刑警劉巖凉驻,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腻要,死亡現(xiàn)場離奇詭異,居然都是意外死亡涝登,警方通過查閱死者的電腦和手機(jī)雄家,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胀滚,“玉大人趟济,你說我怎么就攤上這事≈肓埽” “怎么了咙好?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長褐荷。 經(jīng)常有香客問我勾效,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任层宫,我火速辦了婚禮杨伙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘萌腿。我一直安慰自己限匣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布毁菱。 她就那樣靜靜地躺著米死,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贮庞。 梳的紋絲不亂的頭發(fā)上峦筒,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機(jī)與錄音窗慎,去河邊找鬼物喷。 笑死,一個胖子當(dāng)著我的面吹牛遮斥,可吹牛的內(nèi)容都是我干的峦失。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼术吗,長吁一口氣:“原來是場噩夢啊……” “哼尉辑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起藐翎,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤材蹬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后吝镣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體堤器,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年末贾,在試婚紗的時候發(fā)現(xiàn)自己被綠了闸溃。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡拱撵,死狀恐怖辉川,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拴测,我是刑警寧澤乓旗,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站集索,受9級特大地震影響屿愚,放射性物質(zhì)發(fā)生泄漏汇跨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一妆距、第九天 我趴在偏房一處隱蔽的房頂上張望穷遂。 院中可真熱鬧,春花似錦娱据、人聲如沸蚪黑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忌穿。三九已至,卻和暖如春咽安,著一層夾襖步出監(jiān)牢的瞬間伴网,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工妆棒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沸伏。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓糕珊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親毅糟。 傳聞我的和親對象是個殘疾皇子红选,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容