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

密碼如何“加鹽加密”處理?程序員一定要掌握的知識(shí)

這篇具有很好參考價(jià)值的文章主要介紹了密碼如何“加鹽加密”處理?程序員一定要掌握的知識(shí)。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

前言

一、手寫加鹽算法

1.1、加密

1.1.1、加密思路

1.1.2、加密簡圖

1.1.3、代碼實(shí)現(xiàn)

1.2、解密

1.2.1、解密思路

1.2.2、解密代碼

1.3、驗(yàn)證

二、使用?Spring Security 框架實(shí)現(xiàn)加鹽算法


前言


為什么要使用加鹽的方式對密碼進(jìn)行加密?我們知道傳統(tǒng)的 md5 加密方式是可以通過 “彩虹表” 很容易破解的,因?yàn)?md5 加密每次生成的密碼都是固定的~ 為了解決這個(gè)問題,就出現(xiàn)了加鹽加密方式,每次生成的密碼都是不一樣的~?

接下來我會(huì)講兩種加鹽加密方式(手寫加鹽算法、使用 Spring Security 框架),那么就一起來看一下使用加鹽的方式進(jìn)行加密和解密吧~

一、手寫加鹽算法


實(shí)際上就是一個(gè)加密解密的過程~

1.1、加密

1.1.1、加密思路

加密的主要有以下幾步:

  1. 產(chǎn)生隨機(jī)鹽值(32位)。解釋:這里可以使用 UUID 中的?randomUUID 方法生成一個(gè)長度為 36 位的隨機(jī)鹽值(格式為xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12)),而我們約定的格式中(完全由自己定義)不需要"-",因此將產(chǎn)生的隨機(jī)鹽值先使用 toString 方法轉(zhuǎn)化成字符串,最后用?replaceAll 方法將字符串中的 "-" 用空字符串代替即可。
  2. 將鹽值和明文拼接起來,然后整體使用 md5 加密,得到密文(32位)。解釋:這里就是對明文進(jìn)行加密的過程。
  3. 根據(jù)自己約定的格式,使用 “32位鹽值?+&+ 32位加鹽后得到的密文” 方式進(jìn)行加密得到最終密碼。解釋:我們這樣去約定格式,是為了更容易的得到鹽值(通過 split 以 $ 為分割符進(jìn)行分割,得到的字符串?dāng)?shù)組下標(biāo) 0 的就是我們需要的鹽值),讓我們能夠解密。

Ps:UUID的第一個(gè)部分與時(shí)間有關(guān),如果你在生成一個(gè)UUID之后,過幾秒又生成一個(gè)UUID,則第一個(gè)部分不同,其余相同。UUID的唯一缺陷在于生成的結(jié)果串會(huì)比較長。

1.1.2、加密簡圖

密碼加鹽,ssm,加鹽算法

1.1.3、代碼實(shí)現(xiàn)

    /**
     * 加鹽并生成密碼
     * @param password 用戶輸入的明文密碼
     * @return 保存到數(shù)據(jù)庫中的密碼
     */
    public static String encrypt(String password) {
        // 產(chǎn)生鹽值(32位)  這里要注意去掉 UUID 生成 -
        String salt = UUID.randomUUID().toString().replaceAll("-", "");
        // 生成加鹽之后的密碼((鹽值 + 密碼)整體 md5 加密)
        String saltPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
        // 生成最終密碼(保存到數(shù)據(jù)庫中的密碼)[自己約定的格式:32位鹽值 +&+ 32位加鹽后的密碼]
        // 這樣約定格式是為了解密的時(shí)候方便得到鹽值
        String finalPassword = salt + "$" + saltPassword;
        return finalPassword;
    }

1.2、解密

1.2.1、解密思路

解密的一個(gè)大體思路如下:

  1. 用戶輸入的密碼使用剛剛講到的加密思路再進(jìn)行加密一次。解釋:這里我們重載上面講到的加密方法,需要傳入兩個(gè)參數(shù),分別是用戶輸入的密碼和鹽值(這里的鹽值我們可以通過對數(shù)據(jù)庫中的最終加密密碼進(jìn)行字符串分割 $ 符號(hào)得到),然后對用戶信息進(jìn)行加密。
  2. 將剛剛加密的密碼 對比 數(shù)據(jù)庫保存的用戶加密的最終密碼 是否一致即可。

通過上述思路可以知道,實(shí)習(xí)解密思路需要兩個(gè)方法~

1.2.2、解密代碼


    /**
     * 加鹽生成密碼(方法1的重載)
     * 此方法在驗(yàn)證密碼的適合需要(將用戶輸入的密碼使用同樣的鹽值加密后對比)
     * @param password 明文
     * @param salt 固定的鹽值
     * @return 最終密碼
     */
    public static String encrypt(String password, String salt) {
        // 生成加鹽后的密碼
        String saltPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
        // 生成最終密碼(約定格式: 32位 鹽值 +&+ 32位加鹽后的密碼)
        String finalPassword = salt + "$" + saltPassword;
        return finalPassword;
    }

    /**
     * 驗(yàn)證密碼
     * @param inputPassword 用戶輸入明文密碼
     * @param finalPassword 數(shù)據(jù)庫中保存的最終密碼
     * @return
     */
    public static boolean check(String inputPassword, String finalPassword) {
        // 判空處理
        if(StringUtils.hasLength(inputPassword) && StringUtils.hasLength(finalPassword) &&
        finalPassword.length() == 65) {
            // 得到鹽值(之前約定: $前面的就是鹽值)
            String salt = finalPassword.split("\\$")[0];// 由于 $ 在這里也可以表示通配符,所以需要使用 \\ 進(jìn)行轉(zhuǎn)義
            // 使用之前的加密步驟將明文進(jìn)行加密,生成最終密碼
            String confirmPassword = PasswordUtils.encrypt(inputPassword, salt);
            // 對比兩個(gè)最終密碼是否相同
            return confirmPassword.equals(finalPassword);
        }
        return false;
    }

1.3、驗(yàn)證

我們可以先將上述方法都封裝在一個(gè)類中,測試的時(shí)候直接調(diào)用此類即可。?

代碼如下:

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

import java.util.UUID;

public class PasswordUtils {

    /**
     * 加鹽并生成密碼
     * @param password 用戶輸入的明文密碼
     * @return 保存到數(shù)據(jù)庫中的密碼
     */
    public static String encrypt(String password) {
        // 產(chǎn)生鹽值(32位)  這里要注意去掉 UUID 生成 -
        String salt = UUID.randomUUID().toString().replaceAll("-", "");
        // 生成加鹽之后的密碼((鹽值 + 密碼)整體 md5 加密)
        String saltPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
        // 生成最終密碼(保存到數(shù)據(jù)庫中的密碼)[自己約定的格式:32位鹽值 +&+ 32位加鹽后的密碼]
        // 這樣約定格式是為了解密的時(shí)候方便得到鹽值
        String finalPassword = salt + "$" + saltPassword;
        return finalPassword;
    }

    /**
     * 加鹽生成密碼(方法1的重載)
     * 此方法在驗(yàn)證密碼的適合需要(將用戶輸入的密碼使用同樣的鹽值加密后對比)
     * @param password 明文
     * @param salt 固定的鹽值
     * @return 最終密碼
     */
    public static String encrypt(String password, String salt) {
        // 生成加鹽后的密碼
        String saltPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
        // 生成最終密碼(約定格式: 32位 鹽值 +&+ 32位加鹽后的密碼)
        String finalPassword = salt + "$" + saltPassword;
        return finalPassword;
    }

    /**
     * 驗(yàn)證密碼
     * @param inputPassword 用戶輸入明文密碼
     * @param finalPassword 數(shù)據(jù)庫中保存的最終密碼
     * @return
     */
    public static boolean check(String inputPassword, String finalPassword) {
        // 判空處理
        if(StringUtils.hasLength(inputPassword) && StringUtils.hasLength(finalPassword) &&
        finalPassword.length() == 65) {
            // 得到鹽值(之前約定: $前面的就是鹽值)
            String salt = finalPassword.split("\\$")[0];// 由于 $ 在這里也可以表示通配符,所以需要使用 \\ 進(jìn)行轉(zhuǎn)義
            // 使用之前的加密步驟將明文進(jìn)行加密,生成最終密碼
            String confirmPassword = PasswordUtils.encrypt(inputPassword, salt);
            // 對比兩個(gè)最終密碼是否相同
            return confirmPassword.equals(finalPassword);
        }
        return false;
    }

}

首先我們可以模擬用戶注冊,對密碼進(jìn)行連續(xù)的三次加密,觀察最后結(jié)果,是否每次產(chǎn)生的密碼都不一致~ 最后模擬用戶登錄,分別輸入正確的密碼和錯(cuò)誤的密碼,觀察運(yùn)行結(jié)果~

代碼如下:

	public static void main(String[] args) {
		//用戶注冊時(shí)的密碼
		String password = "1234";
		//分別進(jìn)行三次解密,觀察結(jié)果
		String finalPassword = PasswordUtils.encrypt(password);
		System.out.println(finalPassword);
		System.out.println(PasswordUtils.encrypt(password));
		System.out.println(PasswordUtils.encrypt(password));
		//驗(yàn)證密碼(用戶登錄)
		String input1 = "1234";//正確密碼
		String input2= "12345";//錯(cuò)誤密碼
		System.out.println("密碼1為正確密碼:" + PasswordUtils.check(input1, finalPassword));
		System.out.println("密碼2為錯(cuò)誤密碼:" + PasswordUtils.check(input2, finalPassword));
	}

運(yùn)行結(jié)果如下:

密碼加鹽,ssm,加鹽算法

二、使用?Spring Security 框架實(shí)現(xiàn)加鹽算法


首先需要引入 Spring Security 依賴

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

具體實(shí)現(xiàn):

實(shí)際上我們剛剛手寫的加鹽算法就是在模仿著寫 Spring Security 的加鹽算法的底層,因此使用上也差不多,直接上代碼~

Ps:值得注意的是,如果你只需要使用該框架中的加密方法,那么需要在文件的啟動(dòng)類?DemoApplication 中排除?Spring Security 框架的自檢測機(jī)制(此框架有自己的登錄驗(yàn)證機(jī)制,不關(guān)閉的話會(huì)多出一個(gè)登錄頁面)代碼如下:

@SpringBootApplication(exclude = {SecurityAutoConfiguration.class})//排除 Spring Security 自動(dòng)加載

代碼如下:

	/**
	 * 使用 spring Security 實(shí)現(xiàn)加鹽
	 * @param args
	 */
	public static void main(String[] args) {
		//加鹽的工具類
		BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
		//用戶注冊時(shí)的密碼
		String password = "1234";
		//加密(連續(xù)加密三次觀察結(jié)果)
		String finalPassword = passwordEncoder.encode(password);
		System.out.println(finalPassword);
		System.out.println(passwordEncoder.encode(password));
		System.out.println(passwordEncoder.encode(password));
		//模擬用戶登錄
		String s1 = "1234";//正確密碼
		String s2 = "12345";//錯(cuò)誤密碼
		System.out.println("輸入正確的密碼:" + passwordEncoder.matches(s1, finalPassword));
		System.out.println("輸入錯(cuò)誤的密碼:" + passwordEncoder.matches(s2, finalPassword));
	}

密碼加鹽,ssm,加鹽算法文章來源地址http://www.zghlxwxcb.cn/news/detail-594957.html

到了這里,關(guān)于密碼如何“加鹽加密”處理?程序員一定要掌握的知識(shí)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 職場經(jīng)驗(yàn)、為什么程序員一定要寫單元測試?

    職場經(jīng)驗(yàn)、為什么程序員一定要寫單元測試?

    2024軟件測試面試刷題,這個(gè)小程序(永久刷題),靠它快速找到工作了!(刷題APP的天花板)_軟件測試刷題小程序-CSDN博客 文章瀏覽閱讀2.5k次,點(diǎn)贊85次,收藏11次。你知不知道有這么一個(gè)軟件測試面試的刷題小程序。里面包含了面試常問的軟件測試基礎(chǔ)題,web自動(dòng)化測試、

    2024年02月21日
    瀏覽(29)
  • 程序員想兼職賺錢?這幾個(gè)渠道你一定要知道?

    程序員想兼職賺錢?這幾個(gè)渠道你一定要知道?

    某一天當(dāng)一個(gè)程序員,一拍腦門想要兼職,賺點(diǎn)小錢,于是他打開了知乎,打開了百度搜索兼職。結(jié)果彈出了一大部分有兼職要視頻剪輯的,寫文稿的等等等等。逛了一圈,發(fā)現(xiàn)根本沒有自己合適的兼職。 我想說: 喂!喂!喂! 你不是程序員嗎?我們程序員當(dāng)然要用自己的

    2024年02月14日
    瀏覽(22)
  • 程序員都熟悉但不一定說得清的操作系統(tǒng)基本概念

    任何計(jì)算機(jī)系統(tǒng)都包含一個(gè)名為操作系統(tǒng)的基本程序集合。在這個(gè)集合里,最重要的程序稱為內(nèi)核(kernel)。當(dāng)操作系統(tǒng)啟動(dòng)時(shí),內(nèi)核被裝入到RAM中,內(nèi)核中包含了系統(tǒng)運(yùn)行所必不可少的很多核心過程(procedure)。其他程序是一些不太重要的使用程序,盡管這些程序?yàn)橛脩籼?/p>

    2024年02月02日
    瀏覽(35)
  • 【閃擊Linux系列P9】程序員一定要了解的計(jì)算機(jī)管理理念——描述與組織

    【閃擊Linux系列P9】程序員一定要了解的計(jì)算機(jī)管理理念——描述與組織

    ? 前言 大家好吖,歡迎來到 YY 滴 Linux系列 ,熱烈歡迎! 本章主要內(nèi)容面向接觸過Linux的老鐵,從操作系統(tǒng)層面向大家介紹進(jìn)程: 主要內(nèi)容含: 歡迎訂閱 YY 滴Linux專欄!更多干貨持續(xù)更新!以下是傳送門! 訂閱專欄閱讀: YY 的《Linux》系列 ????? 【Linux】Linux環(huán)境搭建

    2024年02月12日
    瀏覽(26)
  • 貓頭虎分享:AI時(shí)代SaaS項(xiàng)目程序員一定要懂的技術(shù)名詞詳解(下)

    貓頭虎分享:AI時(shí)代SaaS項(xiàng)目程序員一定要懂的技術(shù)名詞詳解(下)

    博主貓頭虎的技術(shù)世界 ?? 歡迎來到貓頭虎的博客 — 探索技術(shù)的無限可能! 專欄鏈接 : ?? 精選專欄 : 《面試題大全》 — 面試準(zhǔn)備的寶典! 《IDEA開發(fā)秘籍》 — 提升你的IDEA技能! 《100天精通鴻蒙》 — 從Web/安卓到鴻蒙大師! 《100天精通Golang(基礎(chǔ)入門篇)》 — 踏入

    2024年02月21日
    瀏覽(23)
  • 密碼加密——加鹽算法(兩種方式)

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

    密碼安全是一件很重要的事情,所以一定要謹(jǐn)慎對待 常見的主要是3種方式 明文 MD5加密 加鹽算法 首先明文肯定是不可取的,在數(shù)據(jù)庫中明文存儲(chǔ)密碼風(fēng)險(xiǎn)實(shí)在是太大了 簡單來說,使用MD5就是將一串字符串通過某特定的算法來將其變成另一種形式,這樣子就在外觀上起到了加

    2023年04月12日
    瀏覽(21)
  • 【工具分享】程序員在線工具集(json格式化-html格式化-加密工具)

    演示地址 在線工具集 功能介紹 json格式化 。 JSON 可以將程序語言對象中表示的一組數(shù)據(jù)轉(zhuǎn)換為字符串,然后就可以在網(wǎng)絡(luò)或者程序之間輕松地傳遞這個(gè)字符串,并在需要的時(shí)候?qū)⑺€原為各編程語言所支持的數(shù)據(jù)格式,例如在 PHP 中,可以將 JSON還原為數(shù)組或者一個(gè)基本對象

    2024年02月12日
    瀏覽(99)
  • 程序員進(jìn)階之路:程序環(huán)境和預(yù)處理

    程序員進(jìn)階之路:程序環(huán)境和預(yù)處理

    ? 目錄 ? 前言 程序的翻譯環(huán)境和執(zhí)行環(huán)境 翻譯環(huán)境 運(yùn)行環(huán)境 預(yù)處理(預(yù)編譯) 預(yù)定義符號(hào) #define #define 定義標(biāo)識(shí)符 #define 定義宏 ?#define 替換規(guī)則 ?#和## ?#的作用 ##的作用 ?帶副作用的宏參數(shù) ?宏和函數(shù)對比 命名約定 ?#undef 命令行定義 條件編譯? 文件包含 ?嵌套文件包

    2024年02月16日
    瀏覽(26)
  • 【不靠譜程序員】接收到回調(diào)通知的異步處理

    【不靠譜程序員】接收到回調(diào)通知的異步處理

    ? 支付系統(tǒng)中,像資金下發(fā)這種業(yè)務(wù),通常是在我們系統(tǒng)發(fā)給第三方支付通道后,第三方支付通道會(huì)進(jìn)行資金業(yè)務(wù)處理。然后,付款完成后,會(huì)主動(dòng)發(fā)起回調(diào),即,調(diào)用我們系統(tǒng)API,將付款結(jié)果通知給我們系統(tǒng)。 假定我們的支付系統(tǒng)對三方通道回調(diào)通知的處理邏輯包括:①

    2024年02月08日
    瀏覽(17)
  • 哲學(xué)家和程序員眼中的web3:密碼學(xué)、分布式與博弈論

    哲學(xué)家和程序員眼中的web3:密碼學(xué)、分布式與博弈論

    本文將從意識(shí)形態(tài)的角度對web3進(jìn)行“豎向”介紹,并闡述Web3的三大基礎(chǔ)原則。 ——向蘇格拉底法則致敬! 前言 現(xiàn)在已經(jīng)有太多解釋W(xué)eb3的文章了,那么我為什么要寫這一篇呢? 因?yàn)樽鳛橐幻绦騿T和哲學(xué)家,Web3 對我來說非常具有吸引力。 它從根本上說是一場由技術(shù)進(jìn)化促

    2023年04月08日
    瀏覽(14)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包