BCrypt密码加密的简单使用

本文介绍了Bcrypt作为一种加强用户密码安全性的加密算法,对比了它与MD5的区别。Bcrypt的不可逆性和每次加密时生成的不同盐值增加了破解的难度。在实际操作中,通过Java代码展示了如何使用Bcrypt进行密码加密和校验,强调了Bcrypt的加密速度较慢但安全性更高的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.BCrypt基础

在一个项目中,只要涉及用户的登陆注册,就涉及到用户密码的保护,用户的密码存在数据库是对管理员是透明的,所以为了防止管理员泄露密码,提高用户密码的安全性,我们通常会对用户密码进行加密后再存入数据库,目前MD5与Bcrypt使用比较多,都不可反向破解生成明文。但任何长度的密码使用MD5加密后长度都是相同的,固定的。而且一个密码使用MD5加密生成的密文唯一。那我就可以记下所有明文使用MD5加密后的密文,解密使用穷举就可以破解。MD5解密网站:https://www.bejson.com/enc/md5/
Bcrypt是单向Hash加密算法,首先我们来了解下Bcrypt加密过程

Bcrypt有四个变量:

  1. count: 正数,代表hash杂凑次数,数值越高越安全,可以使用Random随机生成次数
  2. password: 明文密码字符串。
  3. gensalt: 盐是一个随机生成的含有22个字符的字符串,并且会与密码一起合并进行最终的密文生成
    并且每一次生成的盐的值都是不同的
  4. saltPassword: 经过明文密码password和盐gensalt进行count次数的hash得到saltPassword密文

每次明文字符串password过来,就通过count次循环加盐gensalt加密后得到saltPassword, 然后拼接BCrypt版本号+gensalt盐+saltPassword等到最终的bcrypt密码 ,存入数据库中。

因为Bcrypt加密每次每一次生成的盐的值都不同,count循环次数也不同,
所以一个密码可能生成多个不同的密文,那我想要破解难度就大了,比如MD5加密123456生成一个明文,Bcrypt加密123456生成N个明文,那我要记下来的存储成本就大多了。

bcrypt一个密码出来的时间比较长,需要0.3秒,而MD5只需要一微秒(百万分之一秒),一个40秒可以穷举得到明文的MD5,在bcrypt需要12年-----摘自
https://coolshell.cn/articles/2078.html

二.BCrypt快速入门

(1)新建测试类,main方法中编写代码,实现对密码的加密

 public class TestBcrypt {

    public static void main(String[] args) {
        /**
         * 得到盐
         * 盐是一个随机生成的含有29个字符的字符串,并且会与密码一起合并进行最终的密文生成
         * 并且每一次生成的盐的值都是不同的
         */
        for(int i=0;i<10;i++){
            String gensalt = BCrypt.gensalt();
            System.out.println("salt:"+gensalt);
            String saltPassword = BCrypt.hashpw("123456", gensalt);
            System.out.println("本次生成的密码:"+saltPassword);
        }
    }
}

(2)main方法中编写代码,实现对密码的校验。BCrypt不支持反运算,只支持密码校验。

//校验密码
boolean checkpw = BCrypt.checkpw("123456", saltPassword);
System.out.println("密码校验结果:"+checkpw);
### Bcrypt 加密与验证机制 Bcrypt 是一种基于 Blowfish 对称加密算法改进而来的哈希函数,专门用于存储密码安全处理[^1]。作为一种单向散列函数,bcrypt 的设计目标是在计算上耗费更多资源来抵御暴力破解攻击。 #### 密码加密过程 在实际应用中,通常会通过编程语言提供的库函数实现 bcrypt 散列操作: 对于 Java 和 Go 这样的主流开发环境而言,都有成熟的第三方库支持 bcrypt 操作[^2]。以下是 Python 中使用 `bcrypt` 库的一个简单例子: ```python import bcrypt # 定义待加密字符串 password = b"my_secret_password" # 生成带盐值的 hash 值 hashed = bcrypt.hashpw(password, bcrypt.gensalt()) print(hashed.decode()) # 输出形如 $2b$12$qweqwe... ``` 这段代码展示了如何利用随机生成的 salt 来增强安全性,并最终得到长度固定为60字符的结果串作为存储形式。 #### 密码验证流程 由于 bcrypt 属于不可逆变换,因此不存在传统意义上的“解密”。相反,在登录认证环节应当采用如下方式完成匹配检验: ```python # 输入用户提交的新密码尝试 input_password = b"user_inputted_password" # 使用之前保存下来的 hashed 进行对比 if bcrypt.checkpw(input_password, stored_hashed): print("Password matches!") else: print("Invalid password.") ``` 这里的关键在于调用 `checkpw()` 函数而不是试图还原原始明文;该函数内部自动完成了相同参数下的重算并比较两个 hash 是否一致的过程[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值