欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java面試題之MD5加密的安全性詳解

 更新時間:2022年10月19日 08:17:58   作者:磊哥  
MD5 是 Message Digest Algorithm 的縮寫,譯為信息摘要算法,它是 Java 語言中使用很廣泛的一種加密算法。本文將通過示例討論下MD5的安全性,感興趣的可以了解一下

MD5 是 Message Digest Algorithm 的縮寫,譯為信息摘要算法,它是 Java 語言中使用很廣泛的一種加密算法。MD5 可以將任意字符串,通過不可逆的字符串變換算法,生成一個唯一的 MD5 信息摘要,這個信息摘要也就是我們通常所說的 MD5 字符串。那么問題來了,MD5 加密安全嗎?

這道題看似簡單,其實是一道送命題,很多人尤其是一些新入門的同學(xué)會覺得,安全啊,MD5 首先是加密的字符串,其次是不可逆的,所以它一定是安全的。如果你這樣回答,那么就徹底掉進面試官給你挖好的坑了。

為什么呢?因為答案是“不安全”,而不是“安全”。

1.彩虹表

MD5 之所以說它是不安全的,是因為每一個原始密碼都會生成一個對應(yīng)的固定密碼,也就是說一個字符串生成的 MD5 值是永遠不變的。這樣的話,雖然它是不可逆的,但可以被窮舉,而窮舉的“產(chǎn)品”就叫做彩虹表。

什么是彩虹表

彩虹表是一個用于加密散列函數(shù)逆運算的預(yù)先計算好的表, 為破解密碼的散列值(或稱哈希值、微縮圖、摘要、指紋、哈希密文)而準(zhǔn)備。 一般主流的彩虹表都在 100G 以上。這樣的表常常用于恢復(fù)由有限集字符組成的固定長度的純文本密碼。這是空間/時間替換的典型實踐,比每一次嘗試都計算哈希的破解處理時間少而儲存空間多,但卻比簡單的對每條輸入散列翻查表的破解方式儲存空間少而處理時間多。

簡單來說,彩虹表就是一個很大的,用于存放窮舉對應(yīng)值的數(shù)據(jù)表。 以 MD5 為例,“1”的 MD5 值是“C4CA4238A0B923820DCC509A6F75849B”,而“2”的 MD5 值是“C81E728D9D4C2F636F067F89CC14862C”,那么就會有一個 MD5 的彩虹表是這樣的:

原始值加密值
1C4CA4238A0B923820DCC509A6F75849B
2C81E728D9D4C2F636F067F89CC14862C
......

大家想想,如果有了這張表之后,那么我就可以通過 MD5 的密文直接查到原始密碼了,所以說數(shù)據(jù)庫如果只使用 MD5 加密,這就好比用了一把插了鑰匙的鎖一樣不安全。

2.解決方案

想要解決以上問題,我們需要引入“加鹽”機制。

鹽(Salt):在密碼學(xué)中,是指通過在密碼任意固定位置插入特定的字符串,讓散列后的結(jié)果和使用原始密碼的散列結(jié)果不相符,這種過程稱之為“加鹽”。

說的通俗一點“加鹽”就像炒菜一樣,放不同的鹽,炒出菜的味道就是不同的,咱們之前使用 MD5 不安全的原因是,每個原始密碼所對應(yīng)的 MD5 值都是固定的,那我們只需要讓密碼每次通過加鹽之后,生成的最終密碼都不同,這樣就能解決加密不安全的問題了。

3.實現(xiàn)代碼

加鹽是一種手段、是一種解決密碼安全問題的思路,而它的實現(xiàn)手段有很多種,我們可以使用框架如 Spring Security 提供的 BCrypt 進行加鹽和驗證,當(dāng)然,我們也可以自己實現(xiàn)加鹽的功能。

本文為了讓大家更好的理解加鹽的機制,所以我們自己來動手來實現(xiàn)一下加鹽的功能。實現(xiàn)加鹽機制的關(guān)鍵是在加密的過程中,生成一個隨機的鹽值,而且隨機鹽值盡量不要重復(fù),這時,我們就可以使用 Java 語言提供的 UUID(Universally Unique Identifier,通用唯一識別碼)來作為鹽值,這樣每次都會生成一個不同的隨機鹽值,且永不重復(fù)。加鹽的實現(xiàn)代碼如下:

import?org.springframework.util.DigestUtils;
import?org.springframework.util.StringUtils;
import?java.util.UUID;

public?class?PasswordUtil?{
????/**
?????*?加密(加鹽處理)
?????*?@param?password?待加密密碼(需要加密的密碼)
?????*?@return?加密后的密碼
?????*/
????public?static?String?encrypt(String?password)?{
????????//?隨機鹽值?UUID
????????String?salt?=?UUID.randomUUID().toString().replaceAll("-",?"");
????????//?密碼=md5(隨機鹽值+密碼)
????????String?finalPassword?=?DigestUtils.md5DigestAsHex((salt?+?password).getBytes());
????????return?salt?+?"$"?+?finalPassword;
????}
}

從上述代碼我們可以看出,加鹽的實現(xiàn)具體步驟是:

  • 使用 UUID 產(chǎn)生一個隨機鹽值;
  • 將隨機鹽值 + 原始密碼一起 MD5,產(chǎn)生一個新密碼(相同的原始密碼,每次都會生成一個不同的新密碼);
  • 將隨機鹽值 + "$"+上一步生成的新密碼加在一起,就是最終生成的密碼。

那么,問題來了,既然每次生成的密碼都不同,那么怎么驗證密碼是否正確呢?要驗證密碼是否正確的關(guān)鍵是需要先獲取鹽值,然后再使用相同的加密方式和步驟,生成一個最終密碼和和數(shù)據(jù)庫中保存的加密密碼進行對比,具體實現(xiàn)代碼如下:

import?org.springframework.util.DigestUtils;
import?org.springframework.util.StringUtils;
import?java.util.UUID;

public?class?PasswordUtil?{
????/**
?????*?加密(加鹽處理)
?????*?@param?password?待加密密碼(需要加密的密碼)
?????*?@return?加密后的密碼
?????*/
????public?static?String?encrypt(String?password)?{
????????//?隨機鹽值?UUID
????????String?salt?=?UUID.randomUUID().toString().replaceAll("-",?"");
????????//?密碼=md5(隨機鹽值+密碼)
????????String?finalPassword?=?DigestUtils.md5DigestAsHex((salt?+?password).getBytes());
????????return?salt?+?"$"?+?finalPassword;
????}

????/**
?????*?解密
?????*?@param?password???????要驗證的密碼(未加密)
?????*?@param?securePassword?數(shù)據(jù)庫中的加了鹽值的密碼
?????*?@return?對比結(jié)果?true?OR?false
?????*/
????public?static?boolean?decrypt(String?password,?String?securePassword)?{
????????boolean?result?=?false;
????????if?(StringUtils.hasLength(password)?&&?StringUtils.hasLength(securePassword))?{
????????????if?(securePassword.length()?==?65?&&?securePassword.contains("$"))?{
????????????????String[]?securePasswordArr?=?securePassword.split("\\$");
????????????????//?鹽值
????????????????String?slat?=?securePasswordArr[0];
????????????????String?finalPassword?=?securePasswordArr[1];
????????????????//?使用同樣的加密算法和隨機鹽值生成最終加密的密碼
????????????????password?=?DigestUtils.md5DigestAsHex((slat?+?password).getBytes());
????????????????if?(finalPassword.equals(password))?{
????????????????????result?=?true;
????????????????}
????????????}
????????}
????????return?result;
????}
}

總結(jié)

只是簡單的使用 MD5 加密是不安全的,因為每個字符串都會生成固定的密文,那么我們就可以使用彩虹表將密文還原出來,所以它不是安全的。想要解決這個問題,我們需要通過加鹽的手段,每次生成一個不同的密碼,就把這個問題解決了。

到此這篇關(guān)于Java面試題之MD5加密的安全性詳解的文章就介紹到這了,更多相關(guān)Java MD5加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 編寫Java代碼制造一個內(nèi)存溢出的情況

    編寫Java代碼制造一個內(nèi)存溢出的情況

    這篇文章主要介紹了編寫Java代碼制造一個內(nèi)存溢出的情況,或許這種有意制造能夠更好地幫助理解Java中的內(nèi)存溢出情況XD 需要的朋友可以參考下
    2015-07-07
  • SpringBoot中的application.properties無法加載問題定位技巧

    SpringBoot中的application.properties無法加載問題定位技巧

    這篇文章主要介紹了SpringBoot中的application.properties無法加載問題定位技巧,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 詳解Java如何優(yōu)雅的實現(xiàn)字典翻譯

    詳解Java如何優(yōu)雅的實現(xiàn)字典翻譯

    當(dāng)我們在Java應(yīng)用程序中需要對字典屬性進行轉(zhuǎn)換返回給前端時,如何簡單、方便、并且優(yōu)雅的處理是一個重要問題。在本文中,我們將介紹如何使用Java中的序列化機制來優(yōu)雅地實現(xiàn)字典值的翻譯,從而簡化開發(fā)
    2023-04-04
  • mybatis中實現(xiàn)枚舉自動轉(zhuǎn)換方法詳解

    mybatis中實現(xiàn)枚舉自動轉(zhuǎn)換方法詳解

    在使用mybatis的時候經(jīng)常會遇到枚舉類型的轉(zhuǎn)換,下面這篇文章主要給大家介紹了關(guān)于mybatis中實現(xiàn)枚舉自動轉(zhuǎn)換的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-08-08
  • Spring源碼解析 Bean的實例化

    Spring源碼解析 Bean的實例化

    這篇文章主要介紹了Spring源碼解析 Bean的實例化,文章圍繞主題展開詳細的內(nèi)容介紹沒具有一定的參考價值,需要的小伙伴可以參考一下
    2022-07-07
  • Java使用JDBC連接數(shù)據(jù)庫的詳細步驟

    Java使用JDBC連接數(shù)據(jù)庫的詳細步驟

    本文詳細講解了Java使用JDBC連接數(shù)據(jù)庫的詳細步驟,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • spring-security關(guān)于hasRole的坑及解決

    spring-security關(guān)于hasRole的坑及解決

    這篇文章主要介紹了spring-security關(guān)于hasRole的坑及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java互斥鎖簡單實例

    Java互斥鎖簡單實例

    這篇文章主要介紹了Java互斥鎖,較為詳細的分析了java互斥鎖的概念與功能,并實例描述了java互斥鎖的原理與使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • Java利用Redis實現(xiàn)消息隊列的示例代碼

    Java利用Redis實現(xiàn)消息隊列的示例代碼

    本篇文章主要介紹了Java利用Redis實現(xiàn)消息隊列的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • 使用java實現(xiàn)BBS論壇發(fā)送郵件過程詳解

    使用java實現(xiàn)BBS論壇發(fā)送郵件過程詳解

    這篇文章主要介紹了使用java發(fā)送郵件過程詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04

最新評論