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

Java使用MD5加鹽對密碼進(jìn)行加密處理,附注冊和登錄加密解密處理

這篇具有很好參考價(jià)值的文章主要介紹了Java使用MD5加鹽對密碼進(jìn)行加密處理,附注冊和登錄加密解密處理。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

在開發(fā)的時(shí)候,有一些敏感信息是不能直接通過明白直接保存到數(shù)據(jù)庫的。最經(jīng)典的就是密碼了。如果直接把密碼以明文的形式入庫,不僅會(huì)泄露用戶的隱私,對系統(tǒng)也是極其的不厲,這樣做是非常危險(xiǎn)的。

那么我們就需要對這些銘文進(jìn)行加密。

Java常用加密手段

現(xiàn)在市場是加密的方式已經(jīng)有很多了,像Base64加密算法(編碼方式),MD5加密(消息摘要算法,驗(yàn)證信息完整性),對稱加密算法,非對稱加密算法,數(shù)字簽名算法,數(shù)字證書,CA認(rèn)證等等。。

場景加密手段應(yīng)用場景

Base64應(yīng)用場景:圖片轉(zhuǎn)碼(應(yīng)用于郵件,img標(biāo)簽,http加密)

MD5應(yīng)用場景:密碼加密、imei加密、文件校驗(yàn)

非對稱加密:電商訂單付款、銀行相關(guān)業(yè)務(wù)

MD5加密的風(fēng)險(xiǎn)

如果直接使用MD5進(jìn)行加密,其實(shí)是不安全的,這是是可以驗(yàn)證的,比如下面這個(gè)例子:

我直接使用MD5對123456的密碼進(jìn)行加密??粗芘J前?,一串隨機(jī)數(shù),但是其實(shí)一碰就碎

md5password解密,Java,java,開發(fā)語言

接下來就使用大家常用的一個(gè)網(wǎng)站進(jìn)行破解:MD5破解網(wǎng)站

把剛才生成的MD5加密后的密碼進(jìn)行解密。

輕松破解,別說黑客了,這個(gè)網(wǎng)站都能破解出來,那風(fēng)險(xiǎn)有多大就不用說了

md5password解密,Java,java,開發(fā)語言

所以我們需要采取一些措施,用于二次不強(qiáng)MD5加密后的密碼,針對這種方式,現(xiàn)在大多數(shù)采取的方式就是加鹽

什么是鹽?

鹽(salt)一般是一個(gè)隨機(jī)生成的字符串或者常量。我們將鹽與原始密碼連接在一起(放在前面或后面都可以),然后將拼接后的字符串加密。salt這個(gè)值是由系統(tǒng)隨機(jī)生成的,并且只有系統(tǒng)知道。即便兩個(gè)用戶使用了同一個(gè)密碼,由于系統(tǒng)為它們生成的salt值不同,散列值也是不同的。

加salt可以一定程度上解決這一問題。所謂加salt方法,就是加點(diǎn)“佐料”。其基本想法是這樣的:當(dāng)用戶首次提供密碼時(shí)(通常是注冊時(shí)),由系統(tǒng)自動(dòng)往這個(gè)密碼里撒一些“佐料”,然后再散列。而當(dāng)用戶登錄時(shí),系統(tǒng)為用戶提供的代碼撒上同樣的“佐料”,然后散列,再比較散列值,已確定密碼是否正確。

這樣也就變成了將密碼+自定義的鹽值來取MD5。但是如果黑客拿到了你的固定的鹽值,那這樣也不安全了。所以比較好的做法是用隨機(jī)鹽值。用戶登陸時(shí)再根據(jù)用戶名取到這個(gè)隨機(jī)的鹽值來計(jì)算MD5。

個(gè)人建議把鹽設(shè)置成隨機(jī)數(shù)而不是常量,這樣更加安全。

引入MD5工具類

坐標(biāo)如下:

<!--MD5加密 對銘文信息進(jìn)行加密操作-->
<dependency>
   <groupId>commons-codec</groupId>
   <artifactId>commons-codec</artifactId>
</dependency>

md5password解密,Java,java,開發(fā)語言

編寫MD5加鹽工具類

這種對銘文加密的操作,我們可以封裝成一個(gè)工具類,在這里我們主要進(jìn)行對明文密碼進(jìn)行MD5加密,并且進(jìn)行二次加鹽加密,以及對比加鹽后的密碼和初始密碼是否相同。

直接把全部代碼附上:

package com.wyh.util;

import org.apache.commons.codec.binary.Hex;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Random;

/**
 * @Author 魏一鶴
 * @Description 將明文密碼進(jìn)行MD5加鹽加密
 * @Date 23:18 2023/2/7
 **/
public class SaltMD5Util {

    /**
     * @Author 魏一鶴
     * @Description 生成普通的MD5密碼
     * @Date 23:17 2023/2/7
     **/
    public static String MD5(String input) {
        MessageDigest md5 = null;
        try {
            // 生成普通的MD5密碼
            md5 = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
            return "check jdk";
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
        char[] charArray = input.toCharArray();
        byte[] byteArray = new byte[charArray.length];
        for (int i = 0; i < charArray.length; i++)
            byteArray[i] = (byte) charArray[i];
        byte[] md5Bytes = md5.digest(byteArray);
        StringBuffer hexValue = new StringBuffer();
        for (int i = 0; i < md5Bytes.length; i++) {
            int val = ((int) md5Bytes[i]) & 0xff;
            if (val < 16)
                hexValue.append("0");
            hexValue.append(Integer.toHexString(val));
        }
        return hexValue.toString();
    }

    /**
     * @Author 魏一鶴
     * @Description 生成鹽和加鹽后的MD5碼,并將鹽混入到MD5碼中,對MD5密碼進(jìn)行加強(qiáng)
     * @Date 23:17 2023/2/7
     **/
    public static String generateSaltPassword(String password) {
        Random random = new Random();
        //生成一個(gè)16位的隨機(jī)數(shù),也就是所謂的鹽
        /**
         * 此處的鹽也可以定義成一個(gè)系統(tǒng)復(fù)雜點(diǎn)的常量,而不是非要靠靠隨機(jī)數(shù)隨機(jī)出來 兩種方式任選其一 例如下面這行代碼:
         * 鹽加密 :SALT的字符串是隨意打的,目的是把MD5加密后的再次加密變得復(fù)雜
         * public static final String SALT = "fskdhfiuhjfshfjhsad4354%@!@#%3";
         **/
        StringBuilder stringBuilder = new StringBuilder(16);
        stringBuilder.append(random.nextInt(99999999)).append(random.nextInt(99999999));
        int len = stringBuilder.length();
        if (len < 16) {
            for (int i = 0; i < 16 - len; i++) {
                stringBuilder.append("0");
            }
        }
        // 生成鹽
        String salt = stringBuilder.toString();
        //將鹽加到明文中,并生成新的MD5碼
        password = md5Hex(password + salt);
        //將鹽混到新生成的MD5碼中,之所以這樣做是為了后期更方便的校驗(yàn)明文和秘文,也可以不用這么做,不過要將鹽單獨(dú)存下來,不推薦這種方式
        char[] cs = new char[48];
        for (int i = 0; i < 48; i += 3) {
            cs[i] = password.charAt(i / 3 * 2);
            char c = salt.charAt(i / 3);
            cs[i + 1] = c;
            cs[i + 2] = password.charAt(i / 3 * 2 + 1);
        }
        return new String(cs);
    }

    /**
     * @Author 魏一鶴
     * @Description 驗(yàn)證明文和加鹽后的MD5碼是否匹配
     * @Date 23:16 2023/2/7
     **/
    public static boolean verifySaltPassword(String password, String md5) {
        //先從MD5碼中取出之前加的鹽和加鹽后生成的MD5碼
        char[] cs1 = new char[32];
        char[] cs2 = new char[16];
        for (int i = 0; i < 48; i += 3) {
            cs1[i / 3 * 2] = md5.charAt(i);
            cs1[i / 3 * 2 + 1] = md5.charAt(i + 2);
            cs2[i / 3] = md5.charAt(i + 1);
        }
        String salt = new String(cs2);
        //比較二者是否相同
        return md5Hex(password + salt).equals(new String(cs1));
    }

    /**
     * @Author 魏一鶴
     * @Description 生成MD5密碼
     * @Date 23:16 2023/2/7
     **/
    private static String md5Hex(String src) {
        try {
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            byte[] bs = md5.digest(src.getBytes());
            return new String(new Hex().encode(bs));
        } catch (Exception e) {
            return null;
        }
    }

    public static void main(String args[]) {
        // 原密碼
        String password = "123456";
        System.out.println("明文(原生)密碼:" + password);
        // MD5加密后的密碼
        String MD5Password = MD5(password);
        System.out.println("普通MD5加密密碼:" + MD5Password);
        // 獲取加鹽后的MD5值
        String SaltPassword = generateSaltPassword(password);
        System.out.println("加鹽后的MD密碼:" + SaltPassword);
        System.out.println("加鹽后的密碼和原生密碼是否是同一字符串:" + verifySaltPassword(password, SaltPassword));
    }

}


測試鹽加密強(qiáng)度

這樣我們就可以簡單的測試下,這傳說中的鹽是否真的這么厲害,還是剛才的套路,我們定義一個(gè)明文為123456的密碼。然后再對生成的MD5密碼進(jìn)行加鹽處理,分別進(jìn)行破解,以及對比加鹽后的密碼和初始密碼是否相同。

md5password解密,Java,java,開發(fā)語言

拿著MD5的密碼進(jìn)行破解,不用想,基本就是一碰就碎

md5password解密,Java,java,開發(fā)語言

然后試試加了鹽之后的把,你會(huì)發(fā)現(xiàn)它破解不了。

md5password解密,Java,java,開發(fā)語言

有了這些的基礎(chǔ)后,我們就可以對用戶注冊和登錄分別進(jìn)行加鹽加密,以及破解密碼對比是否一致了

注冊加密

其實(shí)很簡單,再原有的密碼上進(jìn)行加密即可:

md5password解密,Java,java,開發(fā)語言


	@PostMapping(value = "/save")
    public Result save(@RequestBody User user) {
        return userService.saveUser(user);
    }
  
	@Override
    public Result saveUser(User user) {
        // 密碼 進(jìn)行MD5加鹽再入庫
        user.setPassword(SaltMD5Util.generateSaltPassword(user.getPassword()));
        // 默認(rèn)頭像
        user.setImage("http://localhost:9090/upload/defaultUserImage.jpg");
        if (this.save(user)) {
            return Result.ok(user);
        }
        return Result.fail("保存用戶信息失敗");
    }

接口簡單測試下把,可以看到是以加密的方式入庫的:

md5password解密,Java,java,開發(fā)語言

登錄解密

加密后入庫了可不夠,還要進(jìn)行對比呢,隨意登錄也要處理下:

	@GetMapping(value = "/login")
    public Result login(User user) {
        return userService.login(user);
    }
    
 public Result login(User user) {
        // 賬號(hào)
        String account = user.getAccount();
        // 密碼
        String password = user.getPassword();
        // 如果賬號(hào)或者密碼為空,返回錯(cuò)誤信息
        if (StringUtils.isEmpty(account) || StringUtils.isEmpty(password)) {
            return Result.fail("賬號(hào)和密碼都不能為空!");
        }
        // 根據(jù)賬號(hào)和密碼查詢對應(yīng)的用戶信息
        User loginUser = this.query()
                .eq("account", account)
                .one();
        if (!StringUtils.isEmpty(loginUser)) {
            // 獲取該用戶在數(shù)據(jù)庫里面的加密過的密碼
            String saltPassword = loginUser.getPassword();
            // 輸入的密碼和加密后的密碼進(jìn)行比較
            boolean passwordFlag = SaltMD5Util.verifySaltPassword(password, saltPassword);
            // 如果根據(jù)賬號(hào)查詢和校驗(yàn)加密密碼失敗,則返回錯(cuò)誤信息
            if (StringUtils.isEmpty(loginUser) || !passwordFlag) {
                return Result.fail("登錄失敗,賬號(hào)或者密碼錯(cuò)誤!");
            }
            // 如果賬號(hào)狀態(tài)被禁用了
            if (loginUser.getStatus().equals(ACCOUNT_DISABLE.getCode())) {
                return Result.fail("登錄失敗,該賬號(hào)已被引用,請聯(lián)系管理員!", loginUser);
            }
            // 存在的話返回查詢到的用戶信息
            return Result.ok(loginUser);
        }
        return Result.fail("登錄失敗,賬號(hào)或者密碼錯(cuò)誤!");
    }

我們還以剛才注冊的用戶為例進(jìn)行登錄,可以看到雖然庫里是加密后的密碼,我們輸入的是明文,但是一樣可以匹配上的:

md5password解密,Java,java,開發(fā)語言

總結(jié)

加密真的很重要,重要的信息千萬不能以明文保存!!!文章來源地址http://www.zghlxwxcb.cn/news/detail-787180.html

到了這里,關(guān)于Java使用MD5加鹽對密碼進(jìn)行加密處理,附注冊和登錄加密解密處理的文章就介紹完了。如果您還想了解更多內(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)文章

  • MD5密碼加密

    密碼加密 ?????? 使用工具類的MD5功能方法,加密密碼 ?????? 注冊環(huán)節(jié): ????????????? 1. 獲取用戶輸入密碼 123456 ????????????? 2. 調(diào)用MD5加密密碼,保存新的加密密碼到數(shù)據(jù)庫 ?????? 登錄環(huán)節(jié): ????????????? 1. 獲取用戶輸入密碼 123456 ???????

    2024年02月16日
    瀏覽(18)
  • MD5加鹽

    在原始密碼基礎(chǔ)之上,生成一個(gè)隨機(jī)的字符串(鹽值salt)),拼接后的字符串再次MD5 加密。加鹽格式:$salt$pass 注冊環(huán)節(jié): 1.獲取輸入密碼password1123456 2.調(diào)用工具類,生成一段4位的字符串(鹽值salt) 3.調(diào)用工具類,加密salt+password1=password2 4.保存密碼pasword2和鹽值到數(shù)據(jù)庫 登

    2024年01月23日
    瀏覽(15)
  • 前端密碼加密 —— bcrypt、MD5、SHA-256、鹽

    前端密碼加密 —— bcrypt、MD5、SHA-256、鹽

    ??? 前期回顧 悄悄告訴你:前端如何獲取本機(jī)IP,輕松一步開啟網(wǎng)絡(luò)探秘之旅_彩色之外的博客-CSDN博客 前端獲取 本機(jī) IP 教程 https://blog.csdn.net/m0_57904695/article/details/131855907?spm=1001.2014.3001.5501 ? ? ? ? ? 在前端密碼加密方案中,bcrypt與SHA-256都是常見的加密算法,它們各有優(yōu)劣

    2024年02月05日
    瀏覽(25)
  • postman 請求參數(shù)進(jìn)行md5加密

    1.在代碼片段中,使用 JavaScript 將需要加密的參數(shù)拼接成一個(gè)字符串,例如 2.安裝 CryptoJS 庫。在 Postman 的 \\\"Pre-request Script\\\" 或 \\\"Tests\\\" 中,使用以下命令安裝 CryptoJS: 3.在代碼片段中,使用 CryptoJS 對拼接后的字符串進(jìn)行 MD5 加密,轉(zhuǎn)化為小寫字符串,賦值給請求變量。例如:

    2024年02月05日
    瀏覽(26)
  • 密碼如何“加鹽加密”處理?程序員一定要掌握的知識(shí)

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

    目錄 前言 一、手寫加鹽算法 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 加密方式是可以通過 “彩虹表”

    2024年02月16日
    瀏覽(90)
  • uniapp使用md5加密 js使用md5加密

    uniapp使用md5加密 js使用md5加密

    文章的初衷 最近項(xiàng)目中使用了md5加密,為了方便還不明白怎么使用的朋友參考查閱,當(dāng)然也為了方便博主再次使用所寫 md5加密說明 可在不同平臺(tái)使用 因?yàn)槭褂梅椒ㄊ莏s方法去調(diào)用的所以不局限于某個(gè)平臺(tái) 我這里使用的方式是登錄的時(shí)候進(jìn)行加密,具體其他的使用方式,朋友們自

    2024年02月07日
    瀏覽(81)
  • Apifox&Postman請求參數(shù)進(jìn)行SHA256/MD5加密

    Base64加密,代碼如下: Base64解密,代碼如下: MD5加密,代碼如下: SHA256加密,代碼如下

    2024年02月16日
    瀏覽(28)
  • JMeter處理接口簽名之BeanShell實(shí)現(xiàn)MD5加密

    JMeter處理接口簽名之BeanShell實(shí)現(xiàn)MD5加密

    項(xiàng)目A需要給項(xiàng)目B提供一個(gè)接口,這個(gè)接口加密了,現(xiàn)在需要測試這個(gè)接口,需要怎么編寫腳本呢?實(shí)現(xiàn)接口簽名的方式有兩種: BeanShell實(shí)現(xiàn)MD5加密和 函數(shù)助手實(shí)現(xiàn)MD5加密, 之前已經(jīng)分享過了函數(shù)助手實(shí)現(xiàn)MD5加密 ,今天就來分享下BeanShell實(shí)現(xiàn)MD5加密。 一、接口信息 POST /a

    2024年02月14日
    瀏覽(29)
  • postman 攜帶時(shí)間戳及md5加密預(yù)處理

    postman 攜帶時(shí)間戳及md5加密預(yù)處理

    // 獲取全局變量 uid = postman.getGlobalVariable(“uid”) sid = postman.getGlobalVariable(“sid”) //設(shè)置當(dāng)前時(shí)間戳 postman.setGlobalVariable(“time”,Math.round(new Date().getTime())); time = postman.getGlobalVariable(‘time’) //設(shè)置KEY_WORD為全局變量 postman.setGlobalVariable(“Key”,“******”) KEY_WORD = postman.getGlobalV

    2024年02月14日
    瀏覽(22)
  • java中MD5加密

    MD5加密是一種常見的加密方式,我們經(jīng)常用在保存用戶密碼和關(guān)鍵信息上。那么它到底有什么,又什么好處呢,會(huì)被這么廣泛的運(yùn)用在應(yīng)用開發(fā)中。 MD5加密全程是Message-Digest Algoorithm 5(信息-摘要算法),它對信息進(jìn)行摘要采集,再通過一定的位運(yùn)算,最終獲取加密后的MD5字

    2024年02月05日
    瀏覽(21)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包