亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java中的密碼加密方式

 更新時間:2025年01月09日 10:51:52   投稿:jingxian  
文章介紹了Java中使用MD5算法對密碼進行加密的方法,以及如何通過加鹽和多重加密來提高密碼的安全性,MD5是一種不可逆的哈希算法,適合用于存儲密碼,因為其輸出的摘要長度固定,且不容易發(fā)生碰撞,此外,通過加鹽和多重加密,可以進一步增加密碼的復雜性和安全性

Java的密碼加密方式

密碼加密

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

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

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

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

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

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

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

存在窮舉消息和摘要的對應關系,并利用摘要在此對應關系進行查詢,從而得知消息的做法,但是,由于MD5是128位算法,全部窮舉是不可能實現(xià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);
}

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

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

推薦了解:預計算的哈希鏈、彩虹表、雪花算法。

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

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

一般的應用方式是

public class PasswordEncoder {

    public String encode(String rawPassword) {
        // 加密過程
        // 1. 使用MD5算法
        // 2. 使用隨機的鹽值
        // 3. 循環(huán)5次
        // 4. 鹽的處理方式為:鹽 + 原密碼 + 鹽 + 原密碼 + 鹽
        // 注意:因為使用了隨機鹽,鹽值必須被記錄下來,本次的返回結果使用$分隔鹽與密文
        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);
    }

}

總結

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

相關文章

  • 簡單談談Struts動態(tài)表單(DynamicForm)

    簡單談談Struts動態(tài)表單(DynamicForm)

    下面小編就為大家?guī)硪黄唵握務凷truts動態(tài)表單(DynamicForm)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • RabbitMQ消息隊列之持久化機制詳解

    RabbitMQ消息隊列之持久化機制詳解

    這篇文章主要介紹了RabbitMQ消息隊列之持久化機制詳解,持久化,即將原本存在于內(nèi)存中的數(shù)據(jù)寫入到磁盤上永久保存數(shù)據(jù),防止服務宕機時內(nèi)存數(shù)據(jù)的丟失,Rabbitmq 的持久化分為隊列持久化、消息持久化和交換器持久化,需要的朋友可以參考下
    2023-08-08
  • Java中的ReentrantLock、ReentrantReadWriteLock、StampedLock詳解

    Java中的ReentrantLock、ReentrantReadWriteLock、StampedLock詳解

    這篇文章主要介紹了Java中的ReentrantLock、ReentrantReadWriteLock、StampedLock詳解,讀寫鎖:一個資源能夠被多個讀線程訪問,或者被一個寫線程訪問但是不能同時存在讀寫線程,需要的朋友可以參考下
    2024-01-01
  • 用Java實現(xiàn)全國天氣預報的api接口調(diào)用示例

    用Java實現(xiàn)全國天氣預報的api接口調(diào)用示例

    查詢天氣預報在APP中常用的一個常用功能,本文實例講述了java調(diào)用中國天氣網(wǎng)api獲得天氣預報信息的方法。分享給大家供大家參考。
    2016-10-10
  • 詳解IntelliJ IDEA 中如何配置多個jdk版本即(1.7和1.8兩個jdk都可用)

    詳解IntelliJ IDEA 中如何配置多個jdk版本即(1.7和1.8兩個jdk都可用)

    這篇文章主要介紹了詳解IntelliJ IDEA 中如何配置多個jdk版本即(1.7和1.8兩個jdk都可用),非常具有實用價值,需要的朋友可以參考下
    2017-11-11
  • springcloud干貨之服務注冊與發(fā)現(xiàn)(Eureka)

    springcloud干貨之服務注冊與發(fā)現(xiàn)(Eureka)

    這篇文章主要介紹了springcloud干貨之服務注冊與發(fā)現(xiàn)(Eureka) ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • Java?數(shù)據(jù)結構與算法系列精講之棧

    Java?數(shù)據(jù)結構與算法系列精講之棧

    棧(stack)又名堆棧,它是一種運算受限的線性表。限定僅在表尾進行插入和刪除操作的線性表。這一端被稱為棧頂,相對地,把另一端稱為棧底,棧是基礎中的基礎,如果你還沒掌握透徹就來接著往下看吧
    2022-02-02
  • Springboot+WebSocket實現(xiàn)一對一聊天和公告的示例代碼

    Springboot+WebSocket實現(xiàn)一對一聊天和公告的示例代碼

    這篇文章主要介紹了Springboot+WebSocket實現(xiàn)一對一聊天和公告的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • SpringBoot加載bean的八種方式總結

    SpringBoot加載bean的八種方式總結

    springboot難免要用到bean,但這些bean如何導入,對于初學者時間頭疼的事,下面這篇文章主要給大家介紹了關于SpringBoot加載bean的八種方式,需要的朋友可以參考下
    2022-10-10
  • Java合并集合幾種常見方式總結(List、Set、Map)

    Java合并集合幾種常見方式總結(List、Set、Map)

    這篇文章主要介紹了Java中合并List、Set、Map的多種方法,包括addAll()、Stream.concat()、Stream.of()+flatMap()、List.copyOf()、putAll()、merge()、compute()和StreamAPI等,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-03-03

最新評論