<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          來給密碼加點“鹽”

          共 3418字,需瀏覽 7分鐘

           ·

          2021-04-28 02:53

          須彌零一

          來給密碼加點“鹽”

          今天給大家來點密碼學(xué)的知識!聊聊密碼學(xué)中的“鹽”是怎么回事。

          背景

          什么是“鹽”

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

          為什么要加“鹽”

          通常情況下,當(dāng)字段經(jīng)過散列處理(如[MD5]),會生成一段散列值,而散列后的值一般是無法通過特定算法得到原始字段的。但是某些情況,比如一個大型的彩虹表,通過在表中搜索該MD5值,很有可能在極短的時間內(nèi)找到該散列值對應(yīng)的真實字段內(nèi)容。
          加鹽后的散列值,可以極大的降低由于用戶數(shù)據(jù)被盜而帶來的密碼泄漏風(fēng)險,即使通過彩虹表尋找到了散列后的數(shù)值所對應(yīng)的原始內(nèi)容,但是由于經(jīng)過了加,插入的字符串?dāng)_亂了真正的密碼,使得獲得真實密碼的概率大大降低。

          彩虹表

               彩虹表是一個用于加密散列函數(shù)逆運算的預(yù)先計算好的表, 為破解密碼的散列值(或稱哈希值、微縮圖、摘要、指紋、哈希密文)而準(zhǔn)備。一般主流的彩虹表都在100G以上。這樣的表常常用于恢復(fù)由有限集字符組成的固定長度的純文本密碼。這是空間/時間替換的典型實踐, 比每一次嘗試都計算哈希的暴力破解處理時間少而儲存空間多,但卻比簡單的對每條輸入散列翻查表的破解方式儲存空間少而處理時間多。使用加salt的KDF函數(shù)可以使這種攻擊難以實現(xiàn)。彩虹表是馬丁·赫爾曼早期提出的簡單算法的應(yīng)用。
          —— 摘自《百度百科》

          用例子來說明加“鹽”的意義

          OK!上面這幾段枯燥的文字讀完如果你還不知所云,那沒關(guān)系。咱們通過下面這個例子來說明加“鹽”的意義在哪里!

          原始對照

          假設(shè)我需要創(chuàng)建一個數(shù)據(jù)庫表來存儲用戶登錄的賬號和密碼用于系統(tǒng)的登錄業(yè)務(wù)。那么如果我使用MySQL的話,可能會設(shè)計一張如下的表來存儲用戶的賬號和密碼信息。
          uidusernamepassword
          100Jeremy123456
          101Melissa654321
          有了這張表,每次將客戶端提交的密碼和數(shù)據(jù)庫中的密碼做對比,如果一致則表示密碼正確,登錄放行,反之拒絕登錄。
          這么一看,好像一切都很完美的樣子。直到有一天,因為系統(tǒng)的某個漏洞,黑客盜走了我們這種保存了用戶名和密碼的表。這下出大事了,我們所有的用戶信息完全暴露了,黑客通過這張表里的信息就完全掌握了所有的用戶資料。
          先不說出了這事的影響有多大了,咱接著看看如何來改進我這個很low的存儲方案來避免這個問題。

          進階的設(shè)計

          上面發(fā)生的那種問題是我們無論如何都想要避免的,而且系統(tǒng)的漏洞也是絕對意義上杜絕不了的。那么我們思考一下,即使在表數(shù)據(jù)泄露的情況下,如何來確保數(shù)據(jù)相對安全。
          這個時候,我們就會想到散列計算,例如:MD5、SHA1、SHA256等等,通過散列計算會使計算出的散列值和原始值不相等。登錄驗證的時候我只需要比較密碼明文的散列值和數(shù)據(jù)庫中的散列值就可以判斷用戶輸入的密碼是否正確,同時數(shù)據(jù)庫里的值存儲的也不是原始密碼。這樣就算表數(shù)據(jù)泄露了也隱藏了原始密碼,密碼不就安全了嘛。于是我使用MD5的散列計算,將數(shù)據(jù)庫表改成了下面的樣子。
          uidusernamepassword
          100JeremyE10ADC3949BA59ABBE56E057F20F883E
          101MelissaC33367701511B4F6020EC61DED352059

          注:上面password列存儲的是經(jīng)過MD5散列計算得出的32位大寫的計算結(jié)果

          MD5(123456) = E10ADC3949BA59ABBE56E057F20F883E
          MD5(654321) = C33367701511B4F6020EC61DED352059

          這樣,數(shù)據(jù)庫中保存的就不是密碼明文了,比第一種方案就安全了很多。
          但問題是,這個也只是我們覺得安全了很多。假設(shè)這個密碼是一個類似銀行取款的六位數(shù)字,那黑客難道就沒辦法知道這個MD5的原始明文了嗎?我感覺你也猜到了!
          沒錯!如果你創(chuàng)建了一個 000000 - 999999 范圍內(nèi)所有的MD5散列值Map,這玩意一比較不就出來了嘛!然后我們想著我可以改變密碼的長度,改變算法來讓黑客們必須擁有一個超大的字典才能枚舉出來明文,讓黑客們解密的成本增加,直到他們放棄。但實際上,這個人家也是有辦法的。黑客們可以通過彩虹表來破解我們的密碼。
          文章一開始從百度百科摘抄了一段彩虹表的解釋,如果你還是想知道如何使用彩虹表來破解密碼可以查閱下面這篇文章:
          擴展閱讀:

          ?密碼破解的利器——彩虹表(rainbow table)  https://www.jianshu.com/p/732d9d960411

          加“鹽”的設(shè)計

          至此,我們不得不給我們的密碼加點 ”鹽“ 了,誰想破解就齁死他。所以這次,我把數(shù)據(jù)庫表改成了這種:
          uidusernamesaltpassword
          100Jeremy9eb8fd5830FA2FC5AF55D71363A9956387EE63
          101Melissa7fb9ekC33367701511B4F6020EC61DED352059

          對上表的解讀:

          ?上表中的 salt 是一個隨機的6位字符串?password 的算法變更為 MD5( 密碼明文 + salt )?MD5("123456" + "9eb8fd") = 5830FA2FC5AF55D71363A9956387EE63?MD5("654321" + "7fb9ek") = D925CC53A219768B128AE52DD2C3AFFD

          這樣我們就給密碼加上了 ”鹽“ 。因為黑客不知道加鹽的規(guī)則,所以原始密碼+鹽之后的情況就增加了很多種,這加”鹽“之后就大大的增加了密碼的破譯難度。
          我們上面的示例是直接在原始明文的末尾加上了”鹽“,但這個不是必須的,你可以在任意位置來加鹽,我們以Jeremy這個用戶為例(密碼明文為123456),使用如下方式加”鹽“都是可以的(加粗的字符表示”鹽“值)

          ?1234569eb8fd 末尾加鹽?9eb8fd123456 頭部加鹽?1239eb8fd456 任意位置插入鹽?129eb4568fd 任意位置分散插入鹽?1234df8be956 任意位置倒序加鹽

          上面的例子就可以看出,一個六位數(shù)的鹽就可以讓一個原始的密碼明文產(chǎn)生非常多的變種。當(dāng)然你還可以對你散列運算函數(shù)做變化,比如對加鹽的MD5值再加鹽再求散列 MD5(MD5(password + salt) + salt)。正因為如此,多種的可能性極大的增加了破譯的難度。
          實際的情況中,你還可以把這個”鹽”值和密碼表分開存儲,這樣則又進一步增加難度,因為黑客不知道這個“鹽”值到底是個什么字符。從可能性上來講,不知道這“鹽”是什么就已經(jīng)完全無法破解了。

          最后

          散列值運算的結(jié)果其實是無法通過逆運算算法來破解的,因為不同的值經(jīng)過散列運算可能會得到相同的散列值。就算直到了逆運算算法,我們也還是無法直到具體那個才是明文。散列值破解都是靠字典命中來實現(xiàn)的,彩虹表就是在設(shè)計上減少了命中的時間消耗,但是彩虹表還是需要一個預(yù)先計算的散列鏈來支持的。
          現(xiàn)代密碼學(xué)中的破解防御,其實大部分都是基于讓破解成本(時間或空間或時間+空間)大大增加而使破解成為不可能的。比如按照目前計算機的算力,算出來需要XXX億年的這種。但隨著量子計算機的問世,原來看似牢不可破的加密算法也受到了挑戰(zhàn)。不過我們不也不用過度擔(dān)心,現(xiàn)在量子計算機還是沒有那么成熟,同時密碼學(xué)也有是一群大神們在研究的。等真的到了那一天,應(yīng)該會有針對量子計算機的加密算法問世。
          順便多說一句,平時只要我們設(shè)置的密碼盡量的長一點,大小寫字符、數(shù)字、符號混用都會大大增加密碼的強度。


          ---- END ----



          歡迎關(guān)注我的公眾號“須彌零一”,原創(chuàng)技術(shù)文章第一時間推送。


          瀏覽 84
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  色播日本视频在线观看 | 日本精品网| 亚洲男人天堂av 亚洲视频无码在线 | 国产乱婬A∨片免费视频牛牛 | 天堂色 |