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

Java中的密碼加密方式

 更新時(shí)間:2025年01月09日 10:51:52   投稿:jingxian  
文章介紹了Java中使用MD5算法對(duì)密碼進(jìn)行加密的方法,以及如何通過加鹽和多重加密來提高密碼的安全性,MD5是一種不可逆的哈希算法,適合用于存儲(chǔ)密碼,因?yàn)槠漭敵龅恼L度固定,且不容易發(fā)生碰撞,此外,通過加鹽和多重加密,可以進(jìn)一步增加密碼的復(fù)雜性和安全性

Java的密碼加密方式

密碼加密

【這里采用的是MD5算法加密】

對(duì)密碼進(jìn)行加密,可以有效的保障密碼安全,即使出現(xiàn)數(shù)據(jù)庫泄密,密碼安全也不會(huì)受到影響!為了實(shí)現(xiàn)此目標(biāo),需要在對(duì)密碼進(jìn)行加密時(shí),使用不可逆的算法進(jìn)行處理!

通常,不可以使用加密算法對(duì)密碼進(jìn)行加密碼處理,從嚴(yán)格定義上來看,所有的加密算法都是可以逆向運(yùn)算的,即同時(shí)存在加密和解密這2種操作,加密算法只能用于保證傳輸過程的安全,并不應(yīng)該用于保證需要存儲(chǔ)下來的密碼的安全!

哈希算法都是不可逆的,通常,用于處理密碼加密的算法中,典型的是一些消息摘要算法,例如MD5、SHA256或以上位數(shù)的算法。

消息摘要算法的主要特征有:

  • 消息相同時(shí),摘要一定相同
  • 某種算法,無論消息長度多少,摘要的長度是固定的
  • 消息不同時(shí),摘要幾乎不會(huì)相同

在消息摘要算法中,以MD5為例,其運(yùn)算結(jié)果是一個(gè)128位長度的二進(jìn)制數(shù),通常會(huì)轉(zhuǎn)換成十六進(jìn)制數(shù)顯示,所以是32位長度的十六進(jìn)制數(shù),MD5也被稱之為128位算法。理論上,會(huì)存在2的128次方種類的摘要結(jié)果,且對(duì)應(yīng)2的128次方種不同的消息,如果在未超過2的128次方種消息中,存在2個(gè)或多個(gè)不同的消息對(duì)應(yīng)了相同的摘要,則稱之為:發(fā)生了碰撞。一個(gè)消息摘要算法是否安全,取決其實(shí)際的碰撞概率,關(guān)于消息摘要算法的破解,也是研究其碰撞概率。

存在窮舉消息和摘要的對(duì)應(yīng)關(guān)系,并利用摘要在此對(duì)應(yīng)關(guān)系進(jìn)行查詢,從而得知消息的做法,但是,由于MD5是128位算法,全部窮舉是不可能實(shí)現(xiàn)的,所以,只要原始密碼(消息)足夠復(fù)雜,就不會(huì)被收錄到所記錄的對(duì)應(yīng)關(guān)系中去!

為了進(jìn)一步提高密碼的安全性,在使用消息摘要算法進(jìn)行處理時(shí),通常還會(huì)加鹽!鹽值可以是任意的字符串,用于與密碼一起作為被消息摘要算法運(yùn)算的數(shù)據(jù)即可,例如:

@Test
public void md5Test() {
    String rawPassword = "123456";
    String salt = "kjfcsddkjfdsajfdiusf8743urf";
    String encodedPassword = DigestUtils.md5DigestAsHex(
            (salt + salt + rawPassword + salt + salt).getBytes());
    System.out.println("原密碼:" + rawPassword);
    System.out.println("加密后的密碼:" + encodedPassword);
}

加鹽的目的是使得被運(yùn)算數(shù)據(jù)變得更加復(fù)雜,鹽值本身和用法并沒有明確要求!

甚至,在某些用法或算法中,還會(huì)使用隨機(jī)的鹽值,則可以使用完全相同的原消息對(duì)應(yīng)的摘要卻不同!

推薦了解:預(yù)計(jì)算的哈希鏈、彩虹表、雪花算法。

為了進(jìn)一步保證密碼安全,還可以使用多重加密,即反復(fù)調(diào)用消息摘要算法。

除此以外,還可以使用安全系數(shù)更高的算法,例如SHA-256是256位算法,SHA-384是384位算法,SHA-512是512位算法。

一般的應(yīng)用方式是

public class PasswordEncoder {

    public String encode(String rawPassword) {
        // 加密過程
        // 1. 使用MD5算法
        // 2. 使用隨機(jī)的鹽值
        // 3. 循環(huán)5次
        // 4. 鹽的處理方式為:鹽 + 原密碼 + 鹽 + 原密碼 + 鹽
        // 注意:因?yàn)槭褂昧穗S機(jī)鹽,鹽值必須被記錄下來,本次的返回結(jié)果使用$分隔鹽與密文
        String salt = UUID.randomUUID().toString().replace("-", "");
        String encodedPassword = rawPassword;
        for (int i = 0; i < 5; i++) {
            encodedPassword = DigestUtils.md5DigestAsHex(
                    (salt + encodedPassword + salt + encodedPassword + salt).getBytes());
        }
        return salt + encodedPassword;
    }

    public boolean matches(String rawPassword, String encodedPassword) {
        String salt = encodedPassword.substring(0, 32);
        String newPassword = rawPassword;
            for (int i = 0; i < 5; i++) {
                newPassword = DigestUtils.md5DigestAsHex(
                        (salt + newPassword + salt + newPassword + salt).getBytes());
        }
        newPassword = salt + newPassword;
        return newPassword.equals(encodedPassword);
    }

}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring Boot和Docker實(shí)現(xiàn)微服務(wù)部署的方法

    Spring Boot和Docker實(shí)現(xiàn)微服務(wù)部署的方法

    這篇文章主要介紹了Spring Boot和Docker實(shí)現(xiàn)微服務(wù)部署的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-01-01
  • SpringBoot分離打Jar包的兩種配置方式

    SpringBoot分離打Jar包的兩種配置方式

    這篇文章主要介紹了SpringBoot分離打Jar包的兩種配置方式,方式一是基于maven-jar-plugin,方式二是基于spring-boot-maven-plugin,文中結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • Java壓縮文件工具類ZipUtil使用方法代碼示例

    Java壓縮文件工具類ZipUtil使用方法代碼示例

    這篇文章主要介紹了Java壓縮文件工具類ZipUtil使用方法代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-11-11
  • 劍指Offer之Java算法習(xí)題精講數(shù)組與字符和等差數(shù)列

    劍指Offer之Java算法習(xí)題精講數(shù)組與字符和等差數(shù)列

    跟著思路走,之后從簡單題入手,反復(fù)去看,做過之后可能會(huì)忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會(huì)發(fā)現(xiàn)質(zhì)的變化
    2022-03-03
  • Java中各類日期和時(shí)間轉(zhuǎn)換超詳析總結(jié)(Date和LocalDateTime相互轉(zhuǎn)換等)

    Java中各類日期和時(shí)間轉(zhuǎn)換超詳析總結(jié)(Date和LocalDateTime相互轉(zhuǎn)換等)

    這篇文章主要介紹了Java中日期和時(shí)間處理的幾個(gè)階段,包括java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp、java.util.Calendar和java.util.GregorianCalendar等類,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-01-01
  • Java中解決跨域問題的方法匯總(建議收藏)

    Java中解決跨域問題的方法匯總(建議收藏)

    我們在開發(fā)過程中經(jīng)常會(huì)遇到前后端分離而導(dǎo)致的跨域問題,導(dǎo)致無法獲取返回結(jié)果,下面給大家介紹Java中解決跨域問題的方法匯總,感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • Java中的substring()方法使用舉例詳解

    Java中的substring()方法使用舉例詳解

    這篇文章主要介紹了Java中的substring()方法使用的相關(guān)資料,文中包括其概述、參數(shù)、返回值、使用示例、注意事項(xiàng)、常見用法和總結(jié),通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-12-12
  • JustAuth整合第三方登錄組件樣例

    JustAuth整合第三方登錄組件樣例

    這篇文章主要為大家介紹了JustAuth整合第三方登錄組件樣例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Java Set集合及其子類HashSet與LinkedHashSet詳解

    Java Set集合及其子類HashSet與LinkedHashSet詳解

    這篇文章主要介紹了Java Set集合及其子類HashSet與LinkedHashSet詳解,文章通過Set集合存儲(chǔ)原理展開文章主題相關(guān)介紹,感興趣的小伙伴可以參考一下
    2022-06-06
  • 用Java編寫經(jīng)典小程序

    用Java編寫經(jīng)典小程序

    非常實(shí)用的12種基礎(chǔ)算法的經(jīng)典案例,對(duì)于初學(xué)者來說有很大的幫助,數(shù)量有限需要的朋友可以參考下
    2018-04-04

最新評(píng)論

得荣县| 武强县| 商城县| 桃园市| 南江县| 万安县| 六枝特区| 泗阳县| 桂东县| 平阴县| 云阳县| 体育| 秦皇岛市| 扎赉特旗| 巴彦淖尔市| 新绛县| 科技| 大竹县| 申扎县| 万源市| 盘锦市| 湘西| 庄浪县| 拉萨市| 绍兴县| 凉城县| 石阡县| 海丰县| 沂水县| 邯郸市| 济阳县| 汉阴县| 莆田市| 肃南| 东兴市| 永川市| 仪征市| 福海县| 错那县| 务川| 五河县|