BCrypt 密码数据加解密运用

前言:

当涉及到存储用户密码时,确保密码的安全非常重要。以往,我们通常都是采用 MD5这种不可逆算法来进行密码数据的加密后存储,虽然MD5算法是一种常见的哈希函数,但是它已经不再被认为是安全的选项。

  1. 常规MD5加密,可使用彩虹表碰撞来进行攻击,可以匹配出原密码或者能得到相同密文的明文。
  2. 加盐使攻击者无法采用特定的查询表或彩虹表快速破解大量哈希值,但不能阻止字典攻击 或暴力攻击 。这里假设攻击者已经获取到用户数据库,意味着攻击者知道每个用户的盐值,根据Kerckhoffs's principle,应该假设攻击者知道用户系统使用密码加密算法,如果攻击者使用高端GPU 或定制的ASIC,每秒可以进行数十亿次哈希计算,针对每个用户进行字典查询的效率依旧很高效。

相较于MD5,推荐使用更安全的密码哈希函数,如BCrypt或Scrypt。这里我们来学习一下BCrypt来实现密码数据的加解密操作。


什么是Bcrypt ?

Bcrypt 是一个跨平台的文件加密工具 。由它加密的文件可在所有支持的操作系统 和处理器 上进行转移。它的口令必须是8至56个字符,并将在内部被转化为448位的密钥。

Bcrypt是单向hash算法, 不可逆向解密 ,生成的密文是60位的。


Bcrypt加密的特点:

  1. 相同明文通过Bcrypt生成的密文每次都是不一样的,MD5则相同。这样就无法通过直接比对密文来反推明文。
  2. Bcrypt是种慢哈希算法 ,执行时间较长 。有文章指出,针对某一字符串,Bcrypt执行一次加密约0.3秒,MD5加密约1微秒(百万分之一秒)。使得暴力破解Bcrypt的时间成本很高.
  3. Bcrypt加密长度60位 ,MD5是32位,提高穷举难度。
  4. Bcrypt算法是跨平台的加密算法,数据库迁移后,不会影响原数据的验证

使用工具类

java 复制代码
import org.mindrot.jbcrypt.BCrypt;

public class PasswordUtils {

    // 生成哈希密码
    public static String hashPassword(String password) {
        String salt = BCrypt.gensalt(); // 生成随机盐值
        String hashedPassword = BCrypt.hashpw(password, salt); // 生成哈希密码
        return hashedPassword;
    }

    // 验证密码
    public static boolean checkPassword(String password, String hashedPassword) {
        return BCrypt.checkpw(password, hashedPassword);
    }
}
相关推荐
文丑颜不良啊23 分钟前
LeetCode276~300题目解析
java·leetcode
Vegetable_xu29 分钟前
Spring Bean 循环依赖:为什么有时能过、有时启动就挂
java·spring·mybatis
avi91111 小时前
【AI教人】在Inspector显示所有Delegate-Odin Inspector之三
java·前端·算法·delegate·inspector·editor扩展·unity editor
青春不朽5122 小时前
Python 的 list append 为什么是均摊 O(1)?拆开过度分配那张表,看容量翻倍背后的暗账
java·python·list
小羊没烦恼!2 小时前
.NET 11 Runtime Async 详解
java·运维·开发语言·javascript·python
哇嘎呀2 小时前
RHCSA题目
java·服务器·前端
SL_staff3 小时前
企业知识平台细粒度权限设计实践:从成员组、文档库到操作级的三层防线
java·开源·全栈
周厉3 小时前
ERP系统全景解析:核心模块与业务逻辑框架
java·服务器·前端
开开心心就好3 小时前
课堂随机点名工具,绿色版免安装双击即用
java·服务器·前端·ffmpeg·音视频·perl·symfony
code2cat3 小时前
Java高级篇之Socket:从建立连接到完整收发一条消息
java·开发语言