Java中的密碼加密方式
Java的密碼加密方式
密碼加密
【這里采用的是MD5算法加密】
對(duì)密碼進(jìn)行加密,可以有效的保障密碼安全,即使出現(xiàn)數(shù)據(jù)庫(kù)泄密,密碼安全也不會(huì)受到影響!為了實(shí)現(xiàn)此目標(biāo),需要在對(duì)密碼進(jìn)行加密時(shí),使用不可逆的算法進(jìn)行處理!
通常,不可以使用加密算法對(duì)密碼進(jìn)行加密碼處理,從嚴(yán)格定義上來(lái)看,所有的加密算法都是可以逆向運(yùn)算的,即同時(shí)存在加密和解密這2種操作,加密算法只能用于保證傳輸過(guò)程的安全,并不應(yīng)該用于保證需要存儲(chǔ)下來(lái)的密碼的安全!
哈希算法都是不可逆的,通常,用于處理密碼加密的算法中,典型的是一些消息摘要算法,例如MD5、SHA256或以上位數(shù)的算法。
消息摘要算法的主要特征有:
- 消息相同時(shí),摘要一定相同
- 某種算法,無(wú)論消息長(zhǎng)度多少,摘要的長(zhǎng)度是固定的
- 消息不同時(shí),摘要幾乎不會(huì)相同
在消息摘要算法中,以MD5為例,其運(yùn)算結(jié)果是一個(gè)128位長(zhǎng)度的二進(jìn)制數(shù),通常會(huì)轉(zhuǎn)換成十六進(jìn)制數(shù)顯示,所以是32位長(zhǎng)度的十六進(jìn)制數(shù),MD5也被稱(chēng)之為128位算法。理論上,會(huì)存在2的128次方種類(lèi)的摘要結(jié)果,且對(duì)應(yīng)2的128次方種不同的消息,如果在未超過(guò)2的128次方種消息中,存在2個(gè)或多個(gè)不同的消息對(duì)應(yīng)了相同的摘要,則稱(chēng)之為:發(fā)生了碰撞。一個(gè)消息摘要算法是否安全,取決其實(shí)際的碰撞概率,關(guān)于消息摘要算法的破解,也是研究其碰撞概率。
存在窮舉消息和摘要的對(duì)應(yīng)關(guān)系,并利用摘要在此對(duì)應(yīng)關(guān)系進(jìn)行查詢(xú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ù)雜,鹽值本身和用法并沒(méi)有明確要求!
甚至,在某些用法或算法中,還會(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) { // 加密過(guò)程 // 1. 使用MD5算法 // 2. 使用隨機(jī)的鹽值 // 3. 循環(huán)5次 // 4. 鹽的處理方式為:鹽 + 原密碼 + 鹽 + 原密碼 + 鹽 // 注意:因?yàn)槭褂昧穗S機(jī)鹽,鹽值必須被記錄下來(lái),本次的返回結(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)文章
簡(jiǎn)單談?wù)凷truts動(dòng)態(tài)表單(DynamicForm)
下面小編就為大家?guī)?lái)一篇簡(jiǎn)單談?wù)凷truts動(dòng)態(tài)表單(DynamicForm)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08Java中的ReentrantLock、ReentrantReadWriteLock、StampedLock詳解
這篇文章主要介紹了Java中的ReentrantLock、ReentrantReadWriteLock、StampedLock詳解,讀寫(xiě)鎖:一個(gè)資源能夠被多個(gè)讀線程訪問(wèn),或者被一個(gè)寫(xiě)線程訪問(wèn)但是不能同時(shí)存在讀寫(xiě)線程,需要的朋友可以參考下2024-01-01用Java實(shí)現(xiàn)全國(guó)天氣預(yù)報(bào)的api接口調(diào)用示例
查詢(xún)天氣預(yù)報(bào)在APP中常用的一個(gè)常用功能,本文實(shí)例講述了java調(diào)用中國(guó)天氣網(wǎng)api獲得天氣預(yù)報(bào)信息的方法。分享給大家供大家參考。2016-10-10詳解IntelliJ IDEA 中如何配置多個(gè)jdk版本即(1.7和1.8兩個(gè)jdk都可用)
這篇文章主要介紹了詳解IntelliJ IDEA 中如何配置多個(gè)jdk版本即(1.7和1.8兩個(gè)jdk都可用),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-11-11springcloud干貨之服務(wù)注冊(cè)與發(fā)現(xiàn)(Eureka)
這篇文章主要介紹了springcloud干貨之服務(wù)注冊(cè)與發(fā)現(xiàn)(Eureka) ,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01Java?數(shù)據(jù)結(jié)構(gòu)與算法系列精講之棧
棧(stack)又名堆棧,它是一種運(yùn)算受限的線性表。限定僅在表尾進(jìn)行插入和刪除操作的線性表。這一端被稱(chēng)為棧頂,相對(duì)地,把另一端稱(chēng)為棧底,棧是基礎(chǔ)中的基礎(chǔ),如果你還沒(méi)掌握透徹就來(lái)接著往下看吧2022-02-02Springboot+WebSocket實(shí)現(xiàn)一對(duì)一聊天和公告的示例代碼
這篇文章主要介紹了Springboot+WebSocket實(shí)現(xiàn)一對(duì)一聊天和公告的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04Java合并集合幾種常見(jiàn)方式總結(jié)(List、Set、Map)
這篇文章主要介紹了Java中合并List、Set、Map的多種方法,包括addAll()、Stream.concat()、Stream.of()+flatMap()、List.copyOf()、putAll()、merge()、compute()和StreamAPI等,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-03-03