Laravel 6 - 加密解密与哈希

Laravel 6 - 加密解密与哈希

Table of Contents

1. 加密解密

全局辅助函数:

encrypt($value, $serialize = true)

decrypt($value, $unserialize = true)

Facade:

Crypt::encrypt($value, $serialize = true)

Crypt::decrypt($value, $unserialize = true)

这两组加解密函数的效果是一样的。它们实际调用的都是app('encrypter') 绑定实例,这是一个在Illuminate\Encryption\EncryptionServiceProvider 中注册的Illuminate\Encryption\Encrypter 单例。

在构造Encrypter 加密器的时候需要读取config('app.key')与config('app.cipher')这两个配置。所以这两个配置一旦生成就不要改变,否则会导致之前存储的密文无法解密。

对同一个明文进行两次加密,得到的密文是不一样的!所以不要用encrypt(string)==encryptedString来判断原文是否一致。

encrypt($value, $serialize = true) 默认会对$value实参进行序列化,解密时默认会进行反序列化。所以我们除了加密解密字符串外,还可以用来加密解密对象、数组类型。

Laravel中对cookie的加密解密就是用的app('encrypter')

2. 哈希

全局辅助函数:

bcrypt($value, $options = [])  使用bcrypt算法计算$value的哈希值

Facade:

Hash::make($value, array $options = [])  使用默认哈希算法计算$value的哈希值

Hash::check($value, $hashedValue, array $options = [])   使用默认哈希算法校验$value与$hashedValue

Laravel默认使用bcrypt哈希算法。可以在/config/hashing.php中修改默认哈希算法驱动以及其系数。

对于同一个明文进行两次bcrypt哈希,得到的密文是不一样的!所以不要用bcrypt(string)==hashedString来判断原文是否一致。

哈希算法是不可逆的,所以不存在解密一说。如果要判断原文是否一致,请使用Hash::check($value, $hashedValue) 。

Laravel中对用户密码的加密就是用Hash::make(password) 。

Leave a Reply

Your email address will not be published. Required fields are marked *

Table of Contents

TOC