国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

密碼加密——加鹽算法(兩種方式)

這篇具有很好參考價值的文章主要介紹了密碼加密——加鹽算法(兩種方式)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

加鹽算法

密碼安全是一件很重要的事情,所以一定要謹慎對待

常見的主要是3種方式

  1. 明文
  2. MD5加密
  3. 加鹽算法

首先明文肯定是不可取的,在數(shù)據(jù)庫中明文存儲密碼風險實在是太大了

簡單來說,使用MD5就是將一串字符串通過某特定的算法來將其變成另一種形式,這樣子就在外觀上起到了加密的效果,但是由于背后的算法是固定的,所以每一個字符串都有固定的MD5格式

密碼破解程序可以是暴力破解:將得到的密碼使用MD5轉換成哈希,之后將得到的哈希與最初的哈希進行比較,要是匹配就說明已經(jīng)破解了密碼,但是這種方法的時間復雜度很高,會耗時很久

彩虹表:彩虹表記錄了幾乎所有字符串的MD5對照表

有了彩虹表MD5就相當于是不存在了,因為一種字符串就只有一種特定的MD5格式

手寫一個加鹽算法

首先要理解“鹽”的概念,他就是一個隨機值,沒有任何規(guī)律

這里約定密碼的最終格式都是 鹽值(32位)$加密后的密碼(32位)

加密的實現(xiàn)思路:

每次調用的時候都會隨機生成一個鹽值(隨機、唯一) + 用戶輸入的密碼(使用MD5) = 加密的密碼,鹽值(32位) + $ + 加密密碼(32位) = 最終的密碼格式

解密(驗證密碼)的實現(xiàn)思路:

解密的時候需要兩個密碼 : 用戶輸入的明文待驗證密碼 、 存儲在數(shù)據(jù)庫中的最終密碼(自定義格式: 鹽值(32位)$加密后的密碼(32位))

解密(驗證密碼)的核心在于得到 鹽值

解密的時候,首先從最終數(shù)據(jù)庫中的密碼中來得到鹽值,之后將用戶輸入的明文待驗證密碼加上這個鹽值,生成加密后的密碼,然后使用鹽值 + 分隔符 + 加密后的密碼 生成 最終密碼格式,再與數(shù)據(jù)庫中最終的密碼格式進行比對

要是一樣的,那就說明這個用戶輸入的密碼是沒有問題的,要是不對就說明密碼輸入錯誤

最重要的是先理解加鹽 解密的實現(xiàn)思路,這是最核心的!?。?/p>

就算使用加鹽算法來對密碼加密,也不能保證就一定是安全的,可以針對一個鹽值來生成一個彩虹表,暴力破解也是可以的,但是這只是破解了一個賬號密碼,所以破解的成本是極大的,當破解的成本遠大于收益的時候,可以看做是安全的

解密(驗證密碼)具體的實現(xiàn)步驟:

  1. 從數(shù)據(jù)庫中真正的最終密碼中得到鹽值
  2. 將用戶輸入的明文密碼+鹽值 = 加密后的密碼(使用MD5)
  3. 使用鹽值 + 分隔符 + 加密后的密碼 生成 最終密碼(最終密碼的格式)
  4. 對比生成的最終密碼和數(shù)據(jù)庫中的最終密碼是否相等

要是相等就說明用戶名和密碼都是對的,要是不對,就說明密碼輸入錯誤

為什么就是能驗證成功呢?

最終比對的就是三個部分: 鹽值 我就是從數(shù)據(jù)庫中的最終密碼中拿的前32位,肯定是一樣的,$都是一樣的,加密的部分都是MD5加密的,所以 也一定是一樣的,所以能登錄成功

具體的代碼:

在common包下面建一個PasswordUtils類

package com.example.demo.common;

import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.util.UUID;

public class PasswordUtils{

    /**
     * 1.加鹽并生成最終的密碼
     * @param password 明文的密碼
     * @return 最終生成的密碼
     */
    public static String encrypt(String password){
        //a.產(chǎn)生鹽值
        //UUID.randomUUID()會生成32位數(shù)字+4位-,是隨機的唯一的,將4位-去掉就得到32位數(shù)字的鹽值
        String salt = UUID.randomUUID().toString().replace("-","");
        //生成加鹽后的密碼(需要使用MD5)
        String saltPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
        //生成最終的密碼格式
        String finalPassword = salt + "$" + saltPassword;
        return finalPassword;
    }

    /**
     * 2.加鹽并生成最終密碼格式(方法一的重載),區(qū)別于上面的方法:這個方法是用來解密的,給定了鹽值,生成一個最終密碼,
     后面要和正確的最終密碼進行比對
     * @param password 需要驗證的明文密碼
     * @param salt
     * @return
     */
    public static  String encrypt(String password, String salt){
        //1.生成一個加密后的密碼
        String saltPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
        //2.生成最終的密碼(待驗證)
        String finalPassword = salt + "$" + saltPassword;
        return finalPassword;
    }

    /**
     * 3.驗證密碼
     * @param inputPassword  登錄用戶輸入的明文密碼
     * @param finalPassword  數(shù)據(jù)庫中實際的最終密碼格式
     * @return
     */
    public static boolean check(String inputPassword, String finalPassword){
        //首先判斷這兩個參數(shù)到底有沒有值,數(shù)據(jù)庫中的最終密碼是不是65位
        if(StringUtils.hasLength(inputPassword) && StringUtils.hasLength(finalPassword)
        && finalPassword.length() == 65){
            //a.首先從最終的密碼中得到鹽值
            //使用$將finalPassword劃分成兩個部分,前面的32位的部分就是鹽值
            //注意:這里的$是被認為是一個通配符,所以要轉義一下
            String salt = finalPassword.split("\\$")[0];
            //b.使用之前加密的方法,生成最終的密碼格式(待驗證)
            String checkPassword = encrypt(inputPassword,salt);
            if(checkPassword.equals(finalPassword)){
                return true;
            }
        }
        return false;
    }
}

在寫完了加鹽算法之后,就要修改一下博客的具體調用了

在userinfoController中的注冊接口:

@RequestMapping("/reg")
public AjaxResult reg(UserInfo userinfo) {
    //非空判斷
    //雖然前端已經(jīng)進行了非空檢查,但是用戶可能會通過別的方式直接訪問url繞過前端的非空校驗,所以作為后端,應該要考慮到這一點
    //所以在后端也是要寫非空校驗的
    if (userinfo == null || !StringUtils.hasLength(userinfo.getUsername()) ||
        !StringUtils.hasLength(userinfo.getPassword())){
            return AjaxResult.fail(-1,"非法參數(shù)");
    }
    //不是空的話,就直接返回成功的響應就行了
    //這里響應的是1,所以前端在進行成功判斷的時候才有result.data == 1這一條

    //注冊成功之后要將密碼加鹽,寫進數(shù)據(jù)庫中
    userinfo.setPassword(PasswordUtils.encrypt(userinfo.getPassword()));
    return AjaxResult.success(userService.reg(userinfo));
}

在userinfoController中的登錄接口:

@RequestMapping("/login")
public AjaxResult login(HttpServletRequest request, String username, String password) {
    //1.進行非空判斷
    if (!StringUtils.hasLength(username) || !StringUtils.hasLength(password)){
        //說明沒有傳入任何參數(shù)
        return AjaxResult.fail(-1,"非法請求");
    }
    //2.查詢數(shù)據(jù)庫
    UserInfo userinfo = userService.getUserByName(username);
    if (userinfo != null && userinfo.getId() > 0) {
        //能獲得id就說明用戶名一定是在數(shù)據(jù)庫中,說明是有效用戶

        //使用自己寫的加鹽算法來判斷登錄
        //password是輸入的待驗證的明文密碼,userinfo.getPassword()得到的是數(shù)據(jù)庫中正確的最終密碼格式
        if (PasswordUtils.check(password,userinfo.getPassword())){
            //將用戶的session存儲下來
            //參數(shù)為true:要是沒有session就創(chuàng)建一個會話
            HttpSession session = request.getSession(true);
            //設置session的key和value
            session.setAttribute(ApplicationVariable.USER_SESSION_KEY,userinfo);
            //要是密碼正確,在將數(shù)據(jù)返回之前,考慮到隱私,隱藏密碼
            userinfo.setPassword("");
            return AjaxResult.success(userinfo);
        }
    }
    return AjaxResult.fail(0,null);
}

以上就是自己手寫的一個加鹽算法

實際上,springboot官方也提供了一種更加齊全的安全框架: spring security

spring security

要想使用spring security首先要先引入依賴(可以通過插件Edit Starters來引入依賴)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

在spring security框架中在項目啟動的時候,會自動注入登錄的頁面,在一般的項目中都是有自己的登錄頁面的,所以不需要自動注入登錄,所以要將其去掉

在項目的啟動類前面的@SpringBootApplication注解加上排除SecurityAutoConfiguration.class這個類對象就行了

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;

//關閉spring security的驗證
@SpringBootApplication(exclude = SecurityAutoConfiguration.class)
public class Demo3Application {
    public static void main(String[] args) {
        SpringApplication.run(Demo3Application.class, args);
    }
}

在單元測試中使用spring security中的密碼加鹽算法

package com.example.demo;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

@SpringBootTest
class Demo3ApplicationTests {

    @Test
    void contextLoads() {
        BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
        String str = "111";
        //進行加密
        String finalPassword = bCryptPasswordEncoder.encode(str);
        System.out.println(finalPassword);
        //驗證密碼
        String inputPassword1 = "123";
        String inputPassword2 = "111";
        //inputPassword是用戶輸入的密碼(待驗證),finalPassword是存儲在數(shù)據(jù)庫中的最終密碼格式
        System.out.println(bCryptPasswordEncoder.matches(inputPassword1,finalPassword));
        System.out.println(bCryptPasswordEncoder.matches(inputPassword2,finalPassword));
    }

}

密碼加密——加鹽算法(兩種方式)

加密之后的最終密碼格式: $2a 10 10 10BXpuKmotUdqoS3rFE59anOTrSfk7gCYX5wfsg9ZblBHvc79EyVFOi

spring security中的最終密碼的格式:

密碼加密——加鹽算法(兩種方式)

其實spring security的加鹽算法就是bCryptPasswordEncoder對象的encode方法和matches方法

加密的時候encode方法傳的參數(shù)是用戶輸入的密碼

解密(驗證)的時候,使用的matches方法的參數(shù)分別是用戶輸入的明文密碼 和 數(shù)據(jù)庫中最終密碼格式

所以自己手寫一個加鹽算法之后再去看spring security調用就會很簡單,因為思想都是一樣的,所以先理解實現(xiàn)思路很重要!文章來源地址http://www.zghlxwxcb.cn/news/detail-411759.html

到了這里,關于密碼加密——加鹽算法(兩種方式)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 加鹽加密——保障你的數(shù)據(jù)安全

    加鹽加密——保障你的數(shù)據(jù)安全

    目錄 今日良言:理性和激情是生活不可或缺的調味品 一、加鹽加密 1.普通密碼的缺點 2.什么是加鹽加密 3.加鹽加密的過程 4.加鹽加密的實現(xiàn) 在介紹加鹽加密之前,先想想為什么普通密碼的缺點是什么? 普通的密碼不安全是因為它們通常很容易被猜到或破解。一個簡單的密碼可

    2024年02月06日
    瀏覽(21)
  • 密碼加鹽原理及其實現(xiàn)

    密碼加鹽原理及其實現(xiàn)

    目錄 1. 背景介紹 2. MD5加密算法 2.1 MD5算法的介紹 2.2 MD5算法的缺點 ?3. 加鹽算法 3.1 什么是加鹽算法 3.2 加鹽算法的演示 4. 總結 加密密碼是現(xiàn)代計算機系統(tǒng)中非常重要的一環(huán),其 主要目的是保護用戶的隱私和數(shù)據(jù)安全 。在不加密密碼的情況下, 用戶的賬戶和密碼等信息會以

    2024年02月14日
    瀏覽(19)
  • 密碼學【java】初探究加密方式之非對稱加密

    密碼學【java】初探究加密方式之非對稱加密

    非對稱加密算法又稱現(xiàn)代加密算法。非對稱加密是計算機通信安全的基石,保證了加密數(shù)據(jù)不會被破解。 與對稱加密算法不同,非對稱加密算法需要兩個密鑰:公開密鑰(publickey) 和私有密(privatekey) 公開密鑰和私有密鑰是一對。如果用公開密鑰對數(shù)據(jù)進行加密,只有用對應的

    2024年02月03日
    瀏覽(23)
  • Spring Security BCryptPasswordEncoder 密碼加鹽

    測試類 上面的運行結果 可以發(fā)現(xiàn)對密碼加密, 每次都是不一樣的密文, 但是任意的一個結果密文和原文match , 得到的都是true, 這到底是是怎么回事尼? 先說結論 BCryptPasswordEncoder的 encode 方法對 原文加密, 是會產(chǎn)生隨機數(shù)的 鹽 salt, 所以每次加密得到的密文都是不同的

    2024年02月11日
    瀏覽(20)
  • Python MD5加密的三種方法(可加鹽)

    Python MD5加密的三種方法(可加鹽)

    輸出結果: 輸出結果: 輸出結果: (參考文章:https://blog.csdn.net/xuefeng_210/article/details/123112339)

    2024年02月14日
    瀏覽(20)
  • 淺析加密算法一【凱撒密碼】

    淺析加密算法一【凱撒密碼】

    在密碼學中, 愷撒密碼 (英語: Caesar cipher ),或稱 愷撒加密、愷撒變換、變換加密 ,是一種最簡單且最廣為人知的加密技術。它是一種替換加密的技術,明文中的所有字母都在字母表上向后(或向前)按照一個固定數(shù)目進行偏移后被替換成密文。例如,當偏移量是 3 3

    2023年04月10日
    瀏覽(17)
  • 【密碼學基礎】RSA加密算法

    【密碼學基礎】RSA加密算法

    RSA是一種非對稱加密算法,即加密和解密時用到的密鑰不同。 加密密鑰是公鑰,可以公開;解密密鑰是私鑰,必須保密保存。 基于一個簡單的數(shù)論事實:兩個大質數(shù)相乘很容易,但想要對其乘積進行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰,即公鑰;而兩個

    2024年02月01日
    瀏覽(93)
  • 【RSA加密/解密】PKCS1_OAEP和PKCS1_v1_5兩種填充方案【python RSA密鑰對生成、密碼加密、密文解密、pycharm安裝Crypto】

    一、PKCS1_OAEP和PKCS1_v1_5是公鑰加密標準中的兩種填充方案。 PKCS1_OAEP(Optimal Asymmetric Encryption Padding)是一種更安全的填充方案,它提供了更好的安全性和抗攻擊性。它使用隨機數(shù)進行填充,并引入了哈希函數(shù)來增加安全性。 PKCS1_v1_5是較舊的填充方案,它使用固定的填充字節(jié)序

    2024年02月06日
    瀏覽(62)
  • Java實現(xiàn)密碼加密實現(xiàn)步驟【bcrypt算法】

    在Spring Boot和SSM中實現(xiàn)密碼加密可以使用bcrypt算法。bcrypt是一種密碼哈希函數(shù),通過將密碼與隨機生成的鹽值進行混合,然后再進行多次迭代的計算,最終生成一個安全的哈希密碼。 下面是使用bcrypt算法實現(xiàn)密碼加密的步驟和代碼示例: 通過以上步驟,我們可以在Spring Boot和

    2024年02月11日
    瀏覽(17)
  • 【密碼算法 之一】對稱加密算法 DES \ 3DES 淺析

    【密碼算法 之一】對稱加密算法 DES \ 3DES 淺析

    ??DES(Data Encryption Standard)是1977年美國聯(lián)邦信息處理標準(FIPS)中所采用的一種對稱密碼(FIPS 46-3)。DES一直以來被美國以及其它國家的政府和銀行等廣泛使用。 ??然而,隨著計算機的進步,現(xiàn)在DES已經(jīng)能夠被暴力破解,強度大不如從前了。20世紀末,RSA公司舉辦過破

    2024年02月09日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包