BCrypt密码加密

前言

在当今数字化时代,数据安全已成为每个开发者和企业不可忽视的重要议题。随着网络攻击和数据泄露事件的频发,如何安全地存储用户密码成为了系统设计中至关重要的一环。BCrypt,作为一种广泛使用的密码哈希算法,凭借其独特的设计和强大的安全性,成为了众多开发者的首选。本文将深入探讨BCrypt的工作原理、优势以及在实际应用中的最佳实践,帮助读者更好地理解和应用这一强大的密码加密工具。

简介

今天要给大家介绍的一种加密算法叫做bcrypt, bcrypt是由Niels Provos和David Mazières设计的密码哈希函数,他是基于Blowfish密码而来的,并于1999年在USENIX上提出。

除了加盐来抵御rainbow table 攻击之外,bcrypt的一个非常重要的特征就是自适应性,可以保证加密的速度在一个特定的范围内,即使计算机的运算能力非常高,可以通过增加迭代次数的方式,使得加密速度变慢,从而可以抵御暴力搜索攻击。

bcrypt函数是OpenBSD和其他系统包括一些Linux发行版(如SUSE Linux)的默认密码哈希算法。

 

bcrypt原理

bcrypt是一种基于哈希函数的加密算法,它使用一个密码和一个盐值作为输入,生成一个固定长度的密码哈希值。这个哈希值在每次密码输入时都会重新生成,而且会随着盐值的改变而改变。bcrypt的盐值是一个随机生成的字符串,与密码一起用于哈希函数中,使得相同的密码在每次加密时都会生成不同的哈希值。

bcrypt的另一个重要特点是它使用了一个加密算法来混淆密码哈希值。这个加密算法使用一个密钥和一个初始化向量(IV)来加密密码和盐值。加密后的数据被存储在数据库中,用于后续的密码验证。

bcrypt的加密过程可以分为以下几个步骤:

1.生成盐值:bcrypt使用一个随机数生成器生成一个随机的盐值。这个盐值是一个随机的字符串,用于与密码一起生成哈希值。
2.混合盐值和密码:将密码和盐值混合在一起,然后使用一个哈希函数生成一个固定长度的哈希值。
3.加密哈希值:使用一个加密算法将哈希值混淆,生成一个加密的哈希值。这个加密的哈希值被存储在数据库中。
4.验证密码:在验证密码时,用户输入密码,系统使用相同的盐值、哈希函数和加密算法生成一个新的哈希值。然后,将新的哈希值与数据库中的加密哈希值进行比较,如果它们匹配,则密码验证成功。

 bcrypt密码加密:

在密码加密方面,虽然MD5是一种常见的哈希算法,但它已经被认为不够安全,容易受到彩虹表攻击暴力破解。以下是几种更推荐的密码加密算法:
bcrypt:
bcrypt 是一种专为密码存储设计的哈希算法,它具有内置的盐值生成机制,并且可以通过调整工作因子(cost factor)来增加计算难度,从而抵御暴力破解。
在 Java 中可以使用 BCrypt 库来实现。
PBKDF2:
PBKDF2(Password-Based Key Derivation Function 2)是一种基于密钥的键导出函数,通过多次哈希迭代来增强安全性。
Java 的 javax.crypto.spec.PBEKeySpec 和 SecretKeyFactory 可以用来实现 PBKDF2。
Argon2:
Argon2 是密码散列竞赛的获胜者,被认为是目前最安全的密码哈希算法之一。它有 Argon2d 和 Argon2i 两种变体,分别适用于不同的安全需求。
可以通过第三方库如 password4j 或 argon2-jvm 来实现。

这个加密算法每次生成的密文都不一样,是不可逆的算法

例如:三次新增员工(密码都是123456),生成的密码密文如下:

$2a$10$soIaaIe/kMkm/OclHWo2yu4AQ5zDgk9ICTCbTUO6m5.4vFW4JTVUK

$2a$10$8aV6Pua.1zUfQPfyig9EleX2I0obxbJIgQpmVR4JqvdEIRz8yUdfK

$2a$10$h65eFefiLpMq.rq29d7GOuTRhIsEjy4oi3I4cXlVeTxZJSA/CutLe

具体步骤:

1.先将数据库的密码(123456)改为bcrypt加密密码:$2a$10$soIaaIe/kMkm/OclHWo2yu4AQ5zDgk9ICTCbTUO6m5.4vFW4JTVUK

2.导入依赖

<dependency>
    <groupId>org.mindrot</groupId>
    <artifactId>jbcrypt</artifactId>
    <version>0.4</version>
</dependency>

3.创建一个BCrypt的工具类,里面有两个方法  decode,getCryptograph

public class BCryptUtil {
    public static String getCryptograph(String password) {
        //生成盐值
        String salt = BCrypt.gensalt();

        //使用盐值给密码进行加密
        String hashedPassword = BCrypt.hashpw(password, salt);

        return hashedPassword;
    }

    public static boolean decode(String password, String hashedPassword) {
        boolean isPasswordMatched = BCrypt.checkpw(password, hashedPassword);
        return isPasswordMatched;
    }
}

登录的Servicelmpl的方法,用BCrypt判断密码是否通过

 public Employee login(EmployeeLoginDTO employeeLoginDTO) {
        String username = employeeLoginDTO.getUsername();
        String password = employeeLoginDTO.getPassword();

        //1、根据用户名查询数据库中的数据
        Employee employee = employeeMapper.getByUsername(username);

        //2、处理各种异常情况(用户名不存在、密码不对、账号被锁定)
        if (employee == null) {
            //账号不存在
            throw new AccountNotFoundException(MessageConstant.ACCOUNT_NOT_FOUND);
        }

        //密码比对
        // TODO 后期需要进行md5加密,然后再进行比对

//        String Md5password = DigestUtils.md5DigestAsHex(password.getBytes());
//        if (!Md5password.equals(employee.getPassword())) {
//            //密码错误
//            throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);
//        }

        //bcrypt算法加密
        if (!BCrypt.checkpw(password, employee.getPassword())) {
            //密码错误
            throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR);
        }

        if (employee.getStatus() == StatusConstant.DISABLE) {
            //账号被锁定
            throw new AccountLockedException(MessageConstant.ACCOUNT_LOCKED);
        }

        //3、返回实体对象
        return employee;
    }

新增员工的方法

//新增员工
    @Override
    public void save(EmployeeDTO employeeDTO) {
        Employee employee = new Employee();
        BeanUtils.copyProperties(employeeDTO, employee);
        employee.setStatus(StatusConstant.ENABLE);//启用
        //设置密码,密码为默认密码123456
        employee.setPassword(BCryptUtil.getCryptograph(PasswordConstant.DEFAULT_PASSWORD));

        employeeMapper.insert(employee);
    }

结尾

通过本文的探讨,我们不仅了解了BCrypt的基本原理和优势,还掌握了如何在实际项目中有效地应用这一密码哈希算法。BCrypt凭借其独特的设计和强大的安全性,为我们的数据安全提供了坚实的保障。然而,密码安全只是数据安全的一个方面,作为开发者,我们还需要不断学习和应用更多的安全技术,以应对日益复杂的网络安全挑战。希望本文能为你在密码加密和安全防护方面提供有价值的参考,助你在开发过程中构建更加安全可靠的系统。

 

### RT-DETRv3 网络结构分析 RT-DETRv3 是一种基于 Transformer 的实时端到端目标检测算法,其核心在于通过引入分层密集正监督方法以及一系列创新性的训练策略,解决了传统 DETR 模型收敛慢和解码器训练不足的问题。以下是 RT-DETRv3 的主要网络结构特点: #### 1. **基于 CNN 的辅助分支** 为了增强编码器的特征表示能力,RT-DETRv3 引入了一个基于卷积神经网络 (CNN) 的辅助分支[^3]。这一分支提供了密集的监督信号,能够与原始解码器协同工作,从而提升整体性能。 ```python class AuxiliaryBranch(nn.Module): def __init__(self, in_channels, out_channels): super(AuxiliaryBranch, self).__init__() self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1) self.bn = nn.BatchNorm2d(out_channels) def forward(self, x): return F.relu(self.bn(self.conv(x))) ``` 此部分的设计灵感来源于传统的 CNN 架构,例如 YOLO 系列中的 CSPNet 和 PAN 结构[^2],这些技术被用来优化特征提取效率并减少计算开销。 --- #### 2. **自注意力扰动学习策略** 为解决解码器训练不足的问题,RT-DETRv3 提出了一种名为 *self-att 扰动* 的新学习策略。这种策略通过对多个查询组中阳性样本的标签分配进行多样化处理,有效增加了阳例的数量,进而提高了模型的学习能力和泛化性能。 具体实现方式是在训练过程中动态调整注意力权重分布,确保更多的高质量查询可以与真实标注 (Ground Truth) 进行匹配。 --- #### 3. **共享权重解编码器分支** 除了上述改进外,RT-DETRv3 还引入了一个共享权重的解编码器分支,专门用于提供密集的正向监督信号。这一设计不仅简化了模型架构,还显著降低了参数量和推理时间,使其更适合实时应用需求。 ```python class SharedDecoderEncoder(nn.Module): def __init__(self, d_model, nhead, num_layers): super(SharedDecoderEncoder, self).__init__() decoder_layer = nn.TransformerDecoderLayer(d_model=d_model, nhead=nhead) self.decoder = nn.TransformerDecoder(decoder_layer, num_layers=num_layers) def forward(self, tgt, memory): return self.decoder(tgt=tgt, memory=memory) ``` 通过这种方式,RT-DETRv3 实现了高效的目标检测流程,在保持高精度的同时大幅缩短了推理延迟。 --- #### 4. **与其他模型的关系** 值得一提的是,RT-DETRv3 并未完全抛弃经典的 CNN 技术,而是将其与 Transformer 结合起来形成混合架构[^4]。例如,它采用了 YOLO 系列中的 RepNCSP 模块替代冗余的多尺度自注意力层,从而减少了不必要的计算负担。 此外,RT-DETRv3 还借鉴了 DETR 的一对一匹配策略,并在此基础上进行了优化,进一步提升了小目标检测的能力。 --- ### 总结 综上所述,RT-DETRv3 的网络结构主要包括以下几个关键组件:基于 CNN 的辅助分支、自注意力扰动学习策略、共享权重解编码器分支以及混合编码器设计。这些技术创新共同推动了实时目标检测领域的发展,使其在复杂场景下的表现更加出色。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值