Java使用bcrypt实现对密码加密效果详解

网友投稿 865 2022-08-20


Java使用bcrypt实现对密码加密效果详解

目录简介bcrypt加密原理加密过程校验过程bcrypt与md5的区别示例1、引入依赖2、写测试类3、测试密文含义

简介

本文用示例介绍使用对密码进行加密的算法:bcrypt。

bcrypt是一种自带盐值(自动加盐)的加密方案。

bcrypt加密原理

加密过程

先随机生成saltsalt跟password进行hash

注意

对于同一个密码,每次生成的hash是不同的hash中包含了salt

校验过程

从hash中取出saltsalt跟password进行hash计算将得到的hash跟数据库中提取的的hash进行比对返回Boolean类型:true/false

bcrypt与md5的区别

项md5bcrypt密文长度32位60位安全性安全性差。密码相同时,加密后密文一样。提升安全性的方案:加密前生成随机的盐值(字符串),将它与密码拼接,然后再使用md5加密。安全性好。密码相同时,生成的密文是不一样的。(因为它自动生成随机盐值)加密耗时短略长

示例

1、引入依赖

pom.xml加入如下依赖:

org.mindrot

jbcrypt&lhttp://t;/artifactId>

0.4

总的pom.xml:

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

org.springframework.boot

spring-boot-starter-parent

2.3.0.RELEASE

com.example

demo_SpringBoot

0.0.1-SNAPSHOT

demo_SpringBoot

Demo project for Spring Boot

1.8

org.springframework.boot

spring-boot-starter-web

org.mindrot

jbcrypt

0.4

org.springframework.boot

spring-boot-maven-plugin

2.3.0.RELEASE

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

org.springframework.boot

spring-boot-starter-parent

2.3.0.RELEASE

com.example

demo_SpringBoot

0.0.1-SNAPSHOT

demo_SpringBoot

Demo project for Spring Boot

1.8

org.springframework.boot

spring-boot-starter-web

org.mindrot

jbcrypt

0.4

org.springframework.boot

spring-boot-maven-plugin

2.3.0.RELEASE

2、写测试类

package com.example.controller;

import org.mindrot.jbcrypt.BCrypt;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RestController;

@RestController

public class HelloController {

@GetMapping("/test")

public String test() {

String password = "123456";

// 加密

String encodedPassword = BCrypt.hashpw(password, BCrypt.gensalt());

System.out.println(encodedPassword);

// 使用正确密码验证密码是否正确

boolean flag = BCrypt.checkpw(password, encodedPassword);

System.out.println(flag);

// 使用错误密码验证密码是否正确

flag = BCrypt.checkpw("111222", encodedPassword);

System.out.println(flag);

System.out.println("-------------------------------------------");

return "test success";

}

}

3、测试

访问:http://localhost:8080/test/

多次访问后的后端结果:

$2a$10$63I66GOCxncIufBHEzcbF.LUBA45jCFwATVXz7MTzp7bpDn.SQMSGtruefalse-------------------------------------------$2a$10$CV7iT/TpZVx23IdEvMHhleRSnIPPI2N/s..Cl9Bd50V2LFdff1woatruefalse-------------------------------------------$2a$10$wNTnhUedcx0InkAflqWm0O9M163WRR/RCGLdBSfhrgzJQuBZoEeEGtruefalse-------------------------------------------

密文含义

示例密文:

$2a$10$CV7iT/TpZVx23IdEvMHhleRSnIPPI2N/s..Cl9Bd50V2LFdff1woa

$:分割符,无意义;

2a:bcrypt加密版本号;

10:cost的值(默认值);

之后的22位:salt值;

之后:密码的密文


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:一起来学习Java的泛型
下一篇:idea搭建ssh框架的超详细教程
相关文章

 发表评论

暂时没有评论,来抢沙发吧~