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) 。