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

Spring?后端安全雙劍之JWT?無狀態(tài)認(rèn)證?+?密碼加鹽加密實(shí)戰(zhàn)指南

 更新時(shí)間:2025年12月13日 10:17:57   作者:在堅(jiān)持一下我可沒意見  
本文主要介紹了在Java?Spring后端開發(fā)中如何實(shí)現(xiàn)用戶登錄免Session認(rèn)證和用戶密碼加密以保障數(shù)據(jù)安全,通過使用令牌技術(shù)和加鹽/加密技術(shù),可以提高認(rèn)證體系的安全性和可靠性,感興趣的朋友跟隨小編一起看看吧

引言

在 Java Spring 后端開發(fā)中,“安全” 永遠(yuǎn)是繞不開的話題,用戶登錄如何免 Session 認(rèn)證?用戶密碼如何防止泄露?我們通過上篇令牌技術(shù)下篇加鹽/加密,這兩個(gè)核心技術(shù),來聊聊關(guān)于如何讓后端的認(rèn)證體系更安全、更可靠

加密/加鹽

加密的必要性

在 MySQL 數(shù)據(jù)庫的日常使用過程中,用戶密碼、身份證號碼、手機(jī)號碼這類敏感數(shù)據(jù)的加密處理至關(guān)重要,這是保障數(shù)據(jù)安全的核心環(huán)節(jié)
倘若直接以明文形式存儲這些信息,一旦數(shù)據(jù)庫遭遇黑客攻擊并被非法侵入,攻擊者就能輕易竊取到用戶的各類敏感信息。這種情況的發(fā)生,不僅會(huì)導(dǎo)致用戶個(gè)人信息泄露,還可能給用戶自身或所屬企業(yè)帶來財(cái)產(chǎn)方面的損失,造成難以估量的后果

密碼算法分類

密碼算法主要分為三類:對稱密碼算法,?對稱密碼算法,摘要算法

1. 對稱加密算法

  • 核心特性:加密、解密使用同一密鑰,運(yùn)算速度快、效率高。
  • 子類型
    • 分組密碼算法:將數(shù)據(jù)分割為固定長度的塊進(jìn)行加密(如 AES、DES)。
    • 流密碼算法:逐字節(jié)生成密鑰流,與明文逐位加密(如 ChaCha)。
  • 適用場景:大數(shù)據(jù)量加密(如文件、數(shù)據(jù)庫字段),需注意密鑰安全管理。

2. 非對稱加密算法

  • 核心特性:使用公鑰 + 私鑰的密鑰對,公鑰可公開、私鑰需保密;公鑰加密的數(shù)據(jù)僅能通過對應(yīng)私鑰解密(反之亦然)。
  • 優(yōu)勢:解決了對稱加密的 “密鑰分發(fā)” 問題,支持?jǐn)?shù)字簽名(私鑰簽名、公鑰驗(yàn)證)。
  • 不足:加解密速度遠(yuǎn)慢于對稱加密。
  • 適用場景:小數(shù)據(jù)加密(如密鑰交換、數(shù)字簽名),典型算法如 RSA、ECC。

3. 摘要算法

  • 核心特性單向哈希運(yùn)算,將任意長度數(shù)據(jù)轉(zhuǎn)換為固定長度的 “摘要值”;無法從摘要反推原文,數(shù)據(jù)微小變化會(huì)導(dǎo)致摘要完全不同。
  • 子類型
    • MD(Message Digest):消息摘要算法(如 MD5)。
    • SHA-1(Secure Hash Algorithm):安全散列算法。
    • MAC(Message Authentication Code):消息認(rèn)證碼算法。
  • 適用場景:數(shù)據(jù)完整性驗(yàn)證、密碼存儲(存摘要而非明文)、數(shù)字簽名組件。

加密思路

本篇文字主要以MD5算法來講解加密

MD5可加密原理:加鹽

MD5本身是不可逆的,加上相同的密碼經(jīng)過MD5哈希之后的密?是相同的,就很有可能被破解,但是我們可以采?為?個(gè)密碼拼接?個(gè)隨機(jī)字符來進(jìn)?加密,這個(gè)隨機(jī)字符我們稱之為 “鹽”,這樣子即使黑客拿到數(shù)據(jù)庫的數(shù)據(jù),也是加密后字符串和鹽的組合的字符串

密?相同,鹽值相同,則證明 明?相同

運(yùn)用加密/加鹽

寫加密/解密?具類

public class SecurityUtil {
    //加密
    //返回鹽值+md5(鹽值+明文)
    public static String encrypt(String password) {
        String salt = UUID.randomUUID().toString().replace("-", "");
        String securityPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes(StandardCharsets.UTF_8));
        return salt + securityPassword;
    }
    //解密
    public static boolean verify(String inputPassword, String sqlPassword){
        if(!StringUtils.hasLength(inputPassword)){
            return false;
        }
        if(sqlPassword==null||sqlPassword.length()!=64){
            return false;
        }
        String salt = sqlPassword.substring(0,32);
        String securityPassword = DigestUtils.md5DigestAsHex((salt + inputPassword).getBytes(StandardCharsets.UTF_8));
        return sqlPassword.equals(salt + securityPassword);
    }
}

工具解析:

使用加密/解密?具類簡單測試:

   public static void main(String[] args) {
        String encrypt = encrypt("123456");
        boolean verify = verify("123456", encrypt);
        System.out.println(verify);
    }

測試結(jié)果:

運(yùn)用實(shí)戰(zhàn)

創(chuàng)建響應(yīng)和請求實(shí)體類:

@Data
public class UserLoginRequest {
    @NotNull(message = "用戶名不能為空")
    private String userName;
    @NotNull(message = "密碼不能為空")
    private String password;
}
@Data
@AllArgsConstructor
public class UserLoginResponse {
    private Integer userId;
    private String token;
}

UserLoginResponse 接口類:

@RequestMapping("/login")
    public UserLoginResponse login(@RequestBody @Validated UserLoginRequest userLoginRequest){
        log.info("用戶登錄,用戶名:{}",userLoginRequest.getUserName());
         return userService.checkPassword(userLoginRequest);
    }

UserServiceImpl Serviece類:

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserInfoMapper userInfoMapper;
    @Resource(name = "blogServiceImpl")
    private BlogService blogService;
    @Override
    public UserLoginResponse checkPassword(UserLoginRequest userLoginRequest) {
        QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().eq(UserInfo::getUserName,userLoginRequest.getUserName())
                .eq(UserInfo::getDeleteFlag,0);
        UserInfo userInfo = userInfoMapper.selectOne(queryWrapper);
        if(userInfo==null){
            //用戶不存在
            throw  new BlogException("用戶不存在");
        }
        //判斷密碼是否一致
if(!SecurityUtil.verify(userLoginRequest.getPassword(),userInfo.getPassword())){
            throw new BlogException("用戶密碼錯(cuò)誤");
        }
        //密碼正確
        Map<String,Object> map=new HashMap<>();
        map.put("id",userInfo.getId());
        map.put("name",userInfo.getUserName());
        String token = JwtUtils.genToken(map);
        return  new UserLoginResponse(userInfo.getId(),token);
    }

使?測試類給密碼123456?成密?,寫到數(shù)據(jù)庫:

測試:
當(dāng)密碼輸入123456時(shí),可以登錄

當(dāng)輸入不為123456時(shí)提示密碼輸入錯(cuò)誤,

加密成功

到此這篇關(guān)于Spring 后端安全雙劍JWT 無狀態(tài)認(rèn)證 + 密碼加鹽加密實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)spring jwt無狀態(tài)認(rèn)證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 教你使用java實(shí)現(xiàn)去除各種空格

    教你使用java實(shí)現(xiàn)去除各種空格

    本文給大家匯總介紹了5種java中去除空格的方法,分別是String.trim()、str.replace(" ", "");、replaceAll(" +","");以及自定義的remove函數(shù),非常的簡單實(shí)用,需要的小伙伴可以參考下。
    2015-03-03
  • java實(shí)現(xiàn) 二叉搜索樹功能

    java實(shí)現(xiàn) 二叉搜索樹功能

    這篇文章主要介紹了java實(shí)現(xiàn) 二叉搜索樹功能,代碼簡單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-07-07
  • SpringBoot 整合 Netty 多端口監(jiān)聽的操作方法

    SpringBoot 整合 Netty 多端口監(jiān)聽的操作方法

    Netty提供異步的、基于事件驅(qū)動(dòng)的網(wǎng)絡(luò)應(yīng)用程序框架,用以快速開發(fā)高性能、高可靠性的網(wǎng)絡(luò) IO 程序,是目前最流行的 NIO 框架,這篇文章主要介紹了SpringBoot 整和 Netty 并監(jiān)聽多端口,需要的朋友可以參考下
    2023-10-10
  • Java 中的內(nèi)存映射 mmap

    Java 中的內(nèi)存映射 mmap

    這篇文章主要介紹了Java 中的內(nèi)存映射,mmap 是一種內(nèi)存映射文件的方法,即將一個(gè)文件映射到進(jìn)程的地址空間,實(shí)現(xiàn)文件磁盤地址和一段進(jìn)程虛擬地址的映射,下面來看看詳細(xì)內(nèi)容,需要的朋友可以參考一下
    2021-11-11
  • 在Spring中給HttpServletRequest添加自定義Header的完整指南

    在Spring中給HttpServletRequest添加自定義Header的完整指南

    在Spring應(yīng)用開發(fā)中,我們經(jīng)常需要在請求處理過程中添加自定義的 HTTP Header,由于HttpServletRequest對象在設(shè)計(jì)上是只讀的,直接添加Header會(huì)遇到困難,本文將詳細(xì)介紹如何通過Filter和RequestWrapper的方式優(yōu)雅地解決這個(gè)問題,需要的朋友可以參考下
    2025-10-10
  • 詳解如何把cmd黑窗口把java文件打包成jar

    詳解如何把cmd黑窗口把java文件打包成jar

    本文主要介紹了如何把cmd黑窗口把java文件打包成jar,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 解析SpringBoot中@Autowire注解的實(shí)現(xiàn)原理

    解析SpringBoot中@Autowire注解的實(shí)現(xiàn)原理

    在開發(fā)Java項(xiàng)目時(shí),依賴注入是一種常見的實(shí)現(xiàn)方式,SpringBoot框架通過@Autowired注解來實(shí)現(xiàn)依賴注入的功能,本文將介紹SpringBoot中 Autowired注解實(shí)現(xiàn)的原理
    2023-06-06
  • Java基礎(chǔ)之FastJson詳解

    Java基礎(chǔ)之FastJson詳解

    今天給大家復(fù)習(xí)Java基礎(chǔ)FastJson,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • Mybatis resultType返回結(jié)果為null的問題排查方式

    Mybatis resultType返回結(jié)果為null的問題排查方式

    這篇文章主要介紹了Mybatis resultType返回結(jié)果為null的問題排查方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java多線程之讀寫鎖分離設(shè)計(jì)模式

    Java多線程之讀寫鎖分離設(shè)計(jì)模式

    這篇文章主要介紹了Java多線程讀寫鎖分離設(shè)計(jì)模式,主要利用Java到嗎完成read read 并行化、read write 不允許、write write 不允許幾項(xiàng)任務(wù),需要的朋友可以參考一下
    2021-10-10

最新評論

正定县| 邮箱| 广宁县| 抚顺县| 冷水江市| 江口县| 新绛县| 柘荣县| 隆安县| 称多县| 突泉县| 福州市| 永和县| 中超| 常宁市| 南澳县| 洞口县| 安仁县| 龙泉市| 涞源县| 周口市| 正蓝旗| 弋阳县| 阜城县| 临泉县| 宜良县| 汨罗市| 山西省| 漳平市| 固阳县| 邓州市| 特克斯县| 麦盖提县| 洛南县| 库车县| 青铜峡市| 平江县| 繁昌县| 慈溪市| 宝山区| 原平市|