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

php中文网
发布: 2016-06-06 20:17:50
原创
1714人浏览过

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中可以直接看出来的!

顶级域名交易系统
顶级域名交易系统

1.后台管理登陆直接在网站地址后输入后台路径,默认为 /admin,进入后台管理登陆页面,输入管理员用户名和密码,默认为 中文 admin ,登陆后台。2.后台管理a.注销管理登陆 (离开后台管理时,请点击这里正常退出,确保系统安全)b.查看使用帮助 (如果你在使用系统时,有不清楚的,可以到这里来查看)c.管理员管理 (这里可以添加,修改,删除系统管理员,暂不支持,分权限管理操作)d.分类管理 (

顶级域名交易系统 0
查看详情 顶级域名交易系统

所以说, 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(),非常方便

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号