最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot實(shí)現(xiàn)密碼安全存儲(chǔ)的五種方式小結(jié)

 更新時(shí)間:2025年03月31日 09:34:30   作者:風(fēng)象南  
項(xiàng)目開發(fā)中,密碼安全存儲(chǔ)是非常關(guān)鍵的一環(huán),作為開發(fā)者,我們需要確保用戶的密碼在存儲(chǔ)時(shí)被安全地加密,避免因數(shù)據(jù)泄露而造成嚴(yán)重后果,所以本文給大家介紹了SpringBoot實(shí)現(xiàn)密碼安全存儲(chǔ)的5種方式,需要的朋友可以參考下

為什么不能明文存儲(chǔ)密碼?

首先,我們需要明確一點(diǎn):密碼永遠(yuǎn)不能以明文形式存儲(chǔ)在數(shù)據(jù)庫中。

原因如下:

  • 數(shù)據(jù)泄露風(fēng)險(xiǎn):如果數(shù)據(jù)庫被攻擊,所有用戶的密碼將直接暴露。
  • 用戶隱私保護(hù):許多用戶可能在多個(gè)平臺(tái)使用相同的密碼,明文存儲(chǔ)會(huì)增加其他賬戶被攻破的風(fēng)險(xiǎn)。
  • 法律與合規(guī)要求:許多安全標(biāo)準(zhǔn)(如 GDPR、OWASP 等)都明確禁止明文存儲(chǔ)密碼。

因此,密碼在存儲(chǔ)前必須進(jìn)行加密或哈希處理,在 Spring Boot 中,以下是幾種常見的密碼安全存儲(chǔ)方式。

1. 使用 BCrypt 進(jìn)行哈希

什么是 BCrypt?

BCrypt 是一種基于 Blowfish 加密算法的哈希函數(shù),專為密碼存儲(chǔ)設(shè)計(jì),具有以下特點(diǎn):

  • 內(nèi)置加鹽機(jī)制,避免彩虹表攻擊。
  • 支持設(shè)置計(jì)算復(fù)雜度,可增強(qiáng)哈希強(qiáng)度。
  • 哈希結(jié)果固定為 60 個(gè)字符,方便存儲(chǔ)。

如何使用

  • 引入依賴:如果未使用 Spring Security,需要單獨(dú)引入 spring-security-crypto
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-crypto</artifactId>
</dependency>
  • 密碼加密與驗(yàn)證:使用 BCryptPasswordEncoder 對(duì)密碼進(jìn)行加密與驗(yàn)證:
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

public class PasswordUtils {
    private static final BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();

    // 加密密碼
    public static String encode(String rawPassword) {
        return encoder.encode(rawPassword);
    }

    // 驗(yàn)證密碼
    public static boolean matches(String rawPassword, String encodedPassword) {
        return encoder.matches(rawPassword, encodedPassword);
    }
}
  • 使用示例
public static void main(String[] args) {
    String rawPassword = "mypassword";
    String encodedPassword = PasswordUtils.encode(rawPassword);

    System.out.println("加密后的密碼:" + encodedPassword);

    boolean isMatch = PasswordUtils.matches(rawPassword, encodedPassword);
    System.out.println("密碼匹配結(jié)果:" + isMatch);
}

優(yōu)缺點(diǎn)

  • 優(yōu)點(diǎn)

    • 安全性高,內(nèi)置加鹽機(jī)制。
    • 使用簡(jiǎn)單,Spring Security 原生支持。
  • 缺點(diǎn)

    • 相較于其他哈希算法,性能略低。

2. 使用 PBKDF2 進(jìn)行哈希

什么是 PBKDF2?

PBKDF2(Password-Based Key Derivation Function 2)是一種基于密碼的密鑰派生函數(shù),支持多次迭代計(jì)算,進(jìn)一步增強(qiáng)安全性。

如何使用

  • 引入依賴:如果未使用 Spring Security,需要單獨(dú)引入 spring-security-crypto
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-crypto</artifactId>
</dependency>
  • 實(shí)現(xiàn)密碼加密與驗(yàn)證
import org.springframework.security.crypto.password.Pbkdf2PasswordEncoder;

public class PasswordUtils {
    private static final Pbkdf2PasswordEncoder encoder = new Pbkdf2PasswordEncoder();

    // 加密密碼
    public static String encode(String rawPassword) {
        return encoder.encode(rawPassword);
    }

    // 驗(yàn)證密碼
    public static boolean matches(String rawPassword, String encodedPassword) {
        return encoder.matches(rawPassword, encodedPassword);
    }
}
  • 使用示例
public static void main(String[] args) {
    String rawPassword = "mypassword";
    String encodedPassword = PasswordUtils.encode(rawPassword);

    System.out.println("加密后的密碼:" + encodedPassword);

    boolean isMatch = PasswordUtils.matches(rawPassword, encodedPassword);
    System.out.println("密碼匹配結(jié)果:" + isMatch);
}

優(yōu)缺點(diǎn)

  • 優(yōu)點(diǎn)

    • 安全性高,可調(diào)節(jié)迭代次數(shù)。
    • 廣泛支持,兼容性好。
  • 缺點(diǎn)

    • 相較 BCrypt,使用稍顯復(fù)雜。

3. 使用 Argon2 進(jìn)行哈希

什么是 Argon2?

Argon2 是一種密碼哈希算法,2015 年獲得密碼哈希競(jìng)賽(Password Hashing Competition)冠軍。它目前被認(rèn)為是最安全的密碼哈希算法之一。

如何使用

  • 引入依賴:如果未使用 Spring Security,需要引入 spring-security-crypto
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-crypto</artifactId>
</dependency>
  • 實(shí)現(xiàn)密碼加密與驗(yàn)證
import org.springframework.security.crypto.argon2.Argon2PasswordEncoder;

public class PasswordUtils {
    private static final Argon2PasswordEncoder encoder = new Argon2PasswordEncoder();

    // 加密密碼
    public static String encode(String rawPassword) {
        return encoder.encode(rawPassword);
    }

    // 驗(yàn)證密碼
    public static boolean matches(String rawPassword, String encodedPassword) {
        return encoder.matches(rawPassword, encodedPassword);
    }
}
  • 使用示例
public static void main(String[] args) {
    String rawPassword = "mypassword";
    String encodedPassword = PasswordUtils.encode(rawPassword);

    System.out.println("加密后的密碼:" + encodedPassword);

    boolean isMatch = PasswordUtils.matches(rawPassword, encodedPassword);
    System.out.println("密碼匹配結(jié)果:" + isMatch);
}

優(yōu)缺點(diǎn)

  • 優(yōu)點(diǎn)
    • 安全性極高,專為現(xiàn)代硬件設(shè)計(jì)。
    • 防御 GPU 加速的暴力 破解。
  • 缺點(diǎn)
    • 算法較新,部分老舊系統(tǒng)可能不支持。

4. SCrypt

什么是 SCrypt?

SCrypt 是一種基于密碼的密鑰派生函數(shù),尤其適用于限制硬件加速的攻擊(如 GPU 加速的暴力 破解)。它通過增加內(nèi)存使用量,顯著提高了破解成本。

SCrypt 的特點(diǎn)

  • 高安全性:通過增加內(nèi)存占用,防止大規(guī)模硬件加速的攻擊。
  • 參數(shù)可調(diào):可以調(diào)整計(jì)算強(qiáng)度和內(nèi)存使用量,適應(yīng)不同的性能需求。

如何使用

Spring Security 提供了對(duì) SCrypt 的支持,可以直接使用 SCryptPasswordEncoder。

  • 實(shí)現(xiàn)代碼
import org.springframework.security.crypto.scrypt.SCryptPasswordEncoder;

public class PasswordUtils {
    private static final SCryptPasswordEncoder encoder = new SCryptPasswordEncoder();

    // 加密密碼
    public static String encode(String rawPassword) {
        return encoder.encode(rawPassword);
    }

    // 驗(yàn)證密碼
    public static boolean matches(String rawPassword, String encodedPassword) {
        return encoder.matches(rawPassword, encodedPassword);
    }
}
  • 使用示例
public static void main(String[] args) {
    String rawPassword = "mypassword";
    String encodedPassword = PasswordUtils.encode(rawPassword);

    System.out.println("加密后的密碼:" + encodedPassword);

    boolean isMatch = PasswordUtils.matches(rawPassword, encodedPassword);
    System.out.println("密碼匹配結(jié)果:" + isMatch);
}

優(yōu)缺點(diǎn)

  • 優(yōu)點(diǎn)

    • 抗 GPU 攻擊能力強(qiáng)。
    • 參數(shù)可調(diào),靈活性高。
  • 缺點(diǎn)

    • 性能較低,適合對(duì)安全性要求較高的場(chǎng)景。

5. SHA-256 + Salt

什么是 SHA-256?

SHA-256 是一種廣泛使用的哈希算法,屬于 SHA-2 家族。它生成固定長(zhǎng)度的 256 位哈希值,計(jì)算速度快且實(shí)現(xiàn)簡(jiǎn)單。單獨(dú)使用 SHA-256 不安全,因?yàn)樗鼰o法抵抗彩虹表攻擊。因此,通常需要搭配 Salt(隨機(jī)鹽值) 使用。

實(shí)現(xiàn)原理

  • 加鹽:為每個(gè)密碼生成一個(gè)隨機(jī)鹽值,增加哈希結(jié)果的隨機(jī)性。
  • 迭代:多次循環(huán)計(jì)算,增加破解難度。

如何使用

需要手動(dòng)實(shí)現(xiàn)加鹽和迭代邏輯,可以使用 Java 的 MessageDigest 類。

  • 實(shí)現(xiàn)代碼
import java.security.MessageDigest;
import java.security.SecureRandom;
import java.util.Base64;

public class PasswordUtils {

    // 生成隨機(jī)鹽值
    public static String generateSalt() {
        byte[] salt = new byte[16];
        new SecureRandom().nextBytes(salt);
        return Base64.getEncoder().encodeToString(salt);
    }

    // 使用 SHA-256 進(jìn)行加密
    public static String hashPassword(String password, String salt) {
        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-256");
            String saltedPassword = salt + password;
            byte[] hash = digest.digest(saltedPassword.getBytes());
            for (int i = 0; i < 1000; i++) {  // 多次迭代
                hash = digest.digest(hash);
            }
            return Base64.getEncoder().encodeToString(hash);
        } catch (Exception e) {
            throw new RuntimeException("加密失敗", e);
        }
    }

    // 驗(yàn)證密碼
    public static boolean matches(String rawPassword, String salt, String hashedPassword) {
        return hashPassword(rawPassword, salt).equals(hashedPassword);
    }
}
  • 使用示例
public static void main(String[] args) {
    String rawPassword = "mypassword";
    String salt = PasswordUtils.generateSalt();
    String hashedPassword = PasswordUtils.hashPassword(rawPassword, salt);

    System.out.println("隨機(jī)鹽值:" + salt);
    System.out.println("加密后的密碼:" + hashedPassword);

    boolean isMatch = PasswordUtils.matches(rawPassword, salt, hashedPassword);
    System.out.println("密碼匹配結(jié)果:" + isMatch);
}

優(yōu)缺點(diǎn)

  • 優(yōu)點(diǎn)

    • 實(shí)現(xiàn)簡(jiǎn)單,速度快。
    • 可用于與舊系統(tǒng)兼容的場(chǎng)景。
  • 缺點(diǎn)

    • 安全性相對(duì)較低,需謹(jǐn)慎處理鹽值。

總結(jié)

加密方式安全性性能適用場(chǎng)景
BCrypt中等通用場(chǎng)景,兼容性好
PBKDF2中等高強(qiáng)度密碼存儲(chǔ)
Argon2極高較低對(duì)安全性要求極高的場(chǎng)景
SCrypt極高較低防硬件加速攻擊的場(chǎng)景
SHA-256 + Salt中等安全性不敏感的項(xiàng)目,如內(nèi)部項(xiàng)目

推薦選擇

  • 通用場(chǎng)景:推薦使用 BCrypt,它在性能和安全性之間達(dá)到了良好平衡。
  • 高安全性需求:建議使用 Argon2SCrypt
  • 安全性不敏感的系統(tǒng):可以考慮 SHA-256 + Salt。

以上就是SpringBoot實(shí)現(xiàn)密碼安全存儲(chǔ)的五種方式小結(jié)的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot密碼存儲(chǔ)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • spring MVC中傳遞對(duì)象參數(shù)示例詳解

    spring MVC中傳遞對(duì)象參數(shù)示例詳解

    這篇文章主要給大家介紹了在spring MVC中傳遞對(duì)象參數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看吧。
    2017-06-06
  • SpringBoot集成itext實(shí)現(xiàn)html轉(zhuǎn)PDF

    SpringBoot集成itext實(shí)現(xiàn)html轉(zhuǎn)PDF

    iText是著名的開放源碼的站點(diǎn)sourceforge一個(gè)項(xiàng)目,是用于生成PDF文檔的一個(gè)java類庫,本文主要介紹了如何利用itext實(shí)現(xiàn)html轉(zhuǎn)PDF,需要的可以參考下
    2024-03-03
  • SpringBoot+Response如何統(tǒng)一返回result結(jié)果集

    SpringBoot+Response如何統(tǒng)一返回result結(jié)果集

    這篇文章主要介紹了SpringBoot+Response如何統(tǒng)一返回result結(jié)果集,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • mybatis-plus在pom文件中的出錯(cuò)問題及解決

    mybatis-plus在pom文件中的出錯(cuò)問題及解決

    文章內(nèi)容為提示更新MyBatis-Plus框架至最新版本,并需同步更新Spring?Boot依賴,建議補(bǔ)全Maven倉庫中MyBatis-Plus的artifact?ID(如com.baomidou:mybatis-plus-boot-starter),并參考官方倉庫獲取準(zhǔn)確版本信息
    2025-08-08
  • Java線程池隊(duì)列PriorityBlockingQueue原理分析

    Java線程池隊(duì)列PriorityBlockingQueue原理分析

    這篇文章主要介紹了Java線程池隊(duì)列PriorityBlockingQueue原理分析,PriorityBlockingQueue隊(duì)列是?JDK1.5?的時(shí)候出來的一個(gè)阻塞隊(duì)列,但是該隊(duì)列入隊(duì)的時(shí)候是不會(huì)阻塞的,永遠(yuǎn)會(huì)加到隊(duì)尾,需要的朋友可以參考下
    2023-12-12
  • Java與Http協(xié)議的詳細(xì)介紹

    Java與Http協(xié)議的詳細(xì)介紹

    這篇文章主要介紹了Java與Http協(xié)議的詳細(xì)介紹的相關(guān)資料,這里提供實(shí)例來幫助大家學(xué)習(xí)理解這部分內(nèi)容,需要的朋友可以參考下
    2017-09-09
  • Java 運(yùn)算符 動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java 運(yùn)算符 動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了Java 運(yùn)算符 動(dòng)力節(jié)點(diǎn)Java學(xué)院整理,需要的朋友可以參考下
    2017-04-04
  • DWR異常情況處理常見方法解析

    DWR異常情況處理常見方法解析

    這篇文章主要介紹了DWR異常情況處理常見方法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 使用Java編寫一個(gè)輸出九九口訣乘法表的程序

    使用Java編寫一個(gè)輸出九九口訣乘法表的程序

    在學(xué)習(xí)編程的過程中,編寫簡(jiǎn)單的程序來實(shí)現(xiàn)基本的數(shù)學(xué)運(yùn)算是一個(gè)很好的練習(xí),本文將介紹如何使用Java語言編寫一個(gè)程序,用于輸出9*9的乘法口訣表,需要的朋友可以參考下
    2026-01-01
  • Java和MySQL數(shù)據(jù)庫中關(guān)于小數(shù)的保存問題詳析

    Java和MySQL數(shù)據(jù)庫中關(guān)于小數(shù)的保存問題詳析

    在Java和MySQL中小數(shù)的精度可能會(huì)受到限制,如float類型的小數(shù)只能精確到6-7位,double類型也只能精確到15-16位,這篇文章主要給大家介紹了關(guān)于Java和MySQL數(shù)據(jù)庫中關(guān)于小數(shù)的保存問題,需要的朋友可以參考下
    2024-01-01

最新評(píng)論

鄢陵县| 桑日县| 亳州市| 连平县| 航空| 黄大仙区| 宝山区| 光泽县| 乌恰县| 霍城县| 利川市| 临江市| 定远县| 油尖旺区| 边坝县| 黄冈市| 安义县| 成安县| 沙雅县| 东阳市| 蓝山县| 游戏| 凉城县| 光山县| 建始县| 平山县| 南和县| 舒城县| 墨玉县| 大姚县| 陵水| 化隆| 容城县| 咸宁市| 顺义区| 布尔津县| 滦平县| 化州市| 怀集县| 阿克苏市| 霞浦县|