您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息
免费发信息
三六零分类信息网 > 西双版纳分类信息网,免费分类信息发布

Laravel 5.2 默认的密码加密,怎么加点盐?

2024/5/28 0:37:10发布11次查看
laravel 5.2 默认的密码加密,怎么加点盐?
顺便弱弱的问一下:盐是啥?
protected function create(array $data) { return user::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => bcrypt($data['password']), ]); }

回复内容: laravel 5.2 默认的密码加密,怎么加点盐?
顺便弱弱的问一下:盐是啥?
protected function create(array $data) { return user::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => bcrypt($data['password']), ]); }

bcrypt生成的密码hash中已经包含盐了
盐是用于防止从彩虹表中反查出密码的随机字符串
没有盐的情况: 用户密码是123456, 傻程序员就直接在数据库保存hash('123456'), 坏人拿到数据库后就可以直接从这个hash反查出密码
有盐的情况: 用户仍然用123456, 正常程序员在数据库保存hash('123456'+盐)和盐. 坏人拿到数据库后很难从这个hash还原出密码 (暴力破解仍然可能, 但是至少把低成本的彩虹表废掉了)
https://github.com/laravel/framework/blob/5.1/src/illuminate/hashing/bcrypthasher.php
查看这部分的源代码可得,
// laravel 的 bcrypt 就是 $hash = password_hash($value, password_bcrypt, ['cost' => 10]);
因为 password_hash 使用的是 crypt 算法, 因此参与计算 hash值的:
算法(就像身份证开头能知道省份一样, 由盐值的格式决定), cost(默认10) 和 盐值 是在$hash中可以直接看出来的!
所以说, laravel 中bcrypt的盐值是php自动随机生成的字符, 虽然同一个密码每次计算的hash不一样.
但是通过 $hash 和 密码, 却可以验证密码的正确性!
具体来说, 比如这个
$hash = password_hash('password',password_bcrypt,['cost' => 10]);echo $hash;// 比如我这次算的是// $hash = '$2y$10$dyajoutgjurg9xykgaactom4k1yezvgnkxhf6phulybcenk61bepm';
那么我们从这个 crypt的hash值中可以看到,
因为以$2y$开头, 所以它的算法是 crypt_blowfish .
同时 crypt_blowfish 算法盐值格式规定是 :
以$2y$开头 + 一个两位cost参数 + $ + 22位随机字符(./0-9a-za-z)
$hash(crypt_blowfish是固定60位) = 盐值 + 31位单向加密后的值
参见: https://secure.php.net/manual/en/function.crypt.php
验证密码
if (password_verify('password', $hash)) { echo '密码正确.';} else { echo '密码错误!';}// 原理是: if ($hash === crypt('password', '$2y$10$dyajoutgjurg9xykgaacto')) { echo '密码正确.';} else { echo '密码错误!';}
如果自己写用户系统并且使用php5.5+或php7,可以考虑使用php自带的password_hash()和password_verify(),非常方便
西双版纳分类信息网,免费分类信息发布

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录