• BCrypt 密码数据加解密运用


    前言: 

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

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

    相较于MD5,推荐使用更安全的密码哈希函数,如BCryptScrypt。这里我们来学习一下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算法是跨平台的加密算法,数据库迁移后,不会影响原数据的验证

    使用工具类

    1. import org.mindrot.jbcrypt.BCrypt;
    2. public class PasswordUtils {
    3. // 生成哈希密码
    4. public static String hashPassword(String password) {
    5. String salt = BCrypt.gensalt(); // 生成随机盐值
    6. String hashedPassword = BCrypt.hashpw(password, salt); // 生成哈希密码
    7. return hashedPassword;
    8. }
    9. // 验证密码
    10. public static boolean checkPassword(String password, String hashedPassword) {
    11. return BCrypt.checkpw(password, hashedPassword);
    12. }
    13. }

  • 相关阅读:
    53.【Java 集合】
    2023年中国机场建设标准、机场数量及机场系统投资完成情况分析[图]
    【ROS入门】机器人运动控制以及里程计信息显示
    js基础笔记学习200正则表达式语法1
    VSCode远程连接Linux
    1130:找第一个只出现一次的字符
    基于JAVA一起组局校园交友平台计算机毕业设计源码+系统+数据库+lw文档+部署
    CentOS 7系统安装与配置、常用100条操作命令
    Linux网络编程- IO多路复用
    【双目视觉】 SGBM算法应用(Python版)
  • 原文地址:https://blog.csdn.net/weixin_73077810/article/details/132979551