Java使用bcrypt實(shí)現(xiàn)對(duì)密碼加密效果詳解
簡(jiǎn)介
本文用示例介紹使用對(duì)密碼進(jìn)行加密的算法:bcrypt。
bcrypt是一種自帶鹽值(自動(dòng)加鹽)的加密方案。
bcrypt加密原理
加密過程
- 先隨機(jī)生成salt
- salt跟password進(jìn)行hash
注意
- 對(duì)于同一個(gè)密碼,每次生成的hash是不同的
- hash中包含了salt
校驗(yàn)過程
- 從hash中取出salt
- salt跟password進(jìn)行hash計(jì)算
- 將得到的hash跟數(shù)據(jù)庫中提取的的hash進(jìn)行比對(duì)返回Boolean類型:true/false
bcrypt與md5的區(qū)別
| 項(xiàng) | md5 | bcrypt |
|---|---|---|
| 密文長(zhǎng)度 | 32位 | 60位 |
| 安全性 | 安全性差。 密碼相同時(shí),加密后密文一樣。 提升安全性的方案:加密前生成隨機(jī)的鹽值(字符串),將它與密碼拼接,然后再使用md5加密。 | 安全性好。 密碼相同時(shí),生成的密文是不一樣的。(因?yàn)樗詣?dòng)生成隨機(jī)鹽值) |
| 加密耗時(shí) | 短 | 略長(zhǎng) |
示例
1、引入依賴
pom.xml加入如下依賴:
<dependency>
<groupId>org.mindrot</groupId>
<artifactId>jbcrypt</artifactId>
<version>0.4</version>
</dependency>
總的pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo_SpringBoot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo_SpringBoot</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mindrot</groupId>
<artifactId>jbcrypt</artifactId>
<version>0.4</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.0.RELEASE</version>
</plugin>
</plugins>
</build>
</project>
2、寫測(cè)試類
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);
// 使用正確密碼驗(yàn)證密碼是否正確
boolean flag = BCrypt.checkpw(password, encodedPassword);
System.out.println(flag);
// 使用錯(cuò)誤密碼驗(yàn)證密碼是否正確
flag = BCrypt.checkpw("111222", encodedPassword);
System.out.println(flag);
System.out.println("-------------------------------------------");
return "test success";
}
}
3、測(cè)試
訪問:http://localhost:8080/test/
多次訪問后的后端結(jié)果:
$2a$10$63I66GOCxncIufBHEzcbF.LUBA45jCFwATVXz7MTzp7bpDn.SQMSG
true
false
-------------------------------------------
$2a$10$CV7iT/TpZVx23IdEvMHhleRSnIPPI2N/s..Cl9Bd50V2LFdff1woa
true
false
-------------------------------------------
$2a$10$wNTnhUedcx0InkAflqWm0O9M163WRR/RCGLdBSfhrgzJQuBZoEeEG
true
false
-------------------------------------------
密文含義
示例密文:
$2a$10$CV7iT/TpZVx23IdEvMHhleRSnIPPI2N/s..Cl9Bd50V2LFdff1woa
$:分割符,無意義;
2a:bcrypt加密版本號(hào);
10:cost的值(默認(rèn)值);
之后的22位:salt值;
之后:密碼的密文
到此這篇關(guān)于Java使用bcrypt實(shí)現(xiàn)對(duì)密碼加密效果詳解的文章就介紹到這了,更多相關(guān)Java bcrypt密碼加密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Java并發(fā)編程中的優(yōu)先級(jí)隊(duì)列PriorityBlockingQueue
PriorityBlockingQueue是Java中實(shí)現(xiàn)了堆數(shù)據(jù)結(jié)構(gòu)的線程安全的有界阻塞隊(duì)列。本文將會(huì)深入解讀PriorityBlockingQueue的源碼實(shí)現(xiàn),感興趣的可以了解一下2023-05-05
詳解Spring MVC/Boot 統(tǒng)一異常處理最佳實(shí)踐
在 Web 開發(fā)中, 我們經(jīng)常會(huì)需要處理各種異常,這篇文章主要介紹了詳解Spring MVC/Boot 統(tǒng)一異常處理最佳實(shí)踐,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
解決java攔截器獲取POST入?yún)?dǎo)致@RequestBody參數(shù)丟失問題
文章講述了在Java開發(fā)中使用攔截器獲取POST請(qǐng)求入?yún)r(shí),由于流關(guān)閉導(dǎo)致`@RequestBody`參數(shù)丟失的問題,并提出了一種解決方案,解決方案包括自定義方法、防止流丟失、過濾器和攔截器的合理組織和使用,最終確保了參數(shù)的正確傳遞2024-11-11
深入探究Java線程的創(chuàng)建與構(gòu)造方法
這篇文章主要給大家分享的是java線程的創(chuàng)建以及構(gòu)造方法,想了解具體方式的小伙伴可以參考下面文章內(nèi)容,希望對(duì)你有所幫助2022-04-04
spring?boot中spring框架的版本升級(jí)圖文教程
Spring Boot是一款基于Spring框架的快速開發(fā)框架,它提供了一系列的開箱即用的功能和組件,這篇文章主要給大家介紹了關(guān)于spring?boot中spring框架的版本升級(jí)的相關(guān)資料,需要的朋友可以參考下2023-10-10
Springboot發(fā)送post請(qǐng)求的幾種方式總結(jié)
這篇文章主要為大家詳細(xì)介紹了Springboot發(fā)送post請(qǐng)求的幾種方式,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定的幫助,感興趣的小伙伴可以了解一下2024-01-01
java?Long類型轉(zhuǎn)為json后數(shù)據(jù)損失精度的處理方式
這篇文章主要介紹了java?Long類型轉(zhuǎn)為json后數(shù)據(jù)損失精度的處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01

