涉及身份驗證的系統都需要儲存使用者的認證資訊,常用的使用者認證方式主要為使用者名稱和密碼的方式,為了安全起見,使用者輸入的密碼需要儲存為密文形式,可採用已公開的不可逆的hash加密演算法,比如sha256, sha512, sha3等,對於同一密碼,同一加密演算法會產生相同的hash值,這樣,當使用者進行身份驗證時,也可對使用者輸入的明文密碼應用相同的hash加密演算法,得出乙個hash值,然後使用該hash值和之前儲存好的密文值進行對照,如果兩個值相同,則密碼認證成功,否則密碼認證失敗。
由於密碼是由使用者設定的,在實際應用中,使用者設定的密碼複雜度可能不夠高,同時不同的使用者極有可能會使用相同的密碼,那麼這些使用者對應的密文也會相同,這樣,當儲存使用者密碼的資料庫洩露後,攻擊者會很容易便能找到相同密碼的使用者,從而也降低了破解密碼的難度,因此,在對使用者密碼進行加密時,需要考慮對密碼進行掩飾,即使是相同的密碼,也應該要儲存為不同的密文,即使使用者輸入的是弱密碼,也需要考慮進行增強,從而增加密碼被攻破的難度,而使用帶鹽的加密hash值便能滿足該需求。
輸入: 密碼字串password
輸出:鹽值 salt 、密碼密文passwordhash
函式:加密hash函式
其中:「鹽值 salt」是在加密過程中生成的隨機字串;
可以將salt放到password前面作為字首或放到password後面作為字尾得到新的字串ps,即,ps = password和salt的組合串;
密碼密文passwordhash = hash加密函式(ps );
將使用者名稱、密碼密文passwordhash和鹽值salt一起儲存到資料庫中。
輸入: 密碼字串passwordcur
輸出:密碼校驗是否成功
處理: 1)、取出當前使用者密碼加密時使用的鹽值salt
2)、得到本次輸入的密碼passwordcur和鹽值salt的組合字串ps
3)、得出本次輸入密碼的密文passwordhashcur= hash加密函式(ps );
4)、比較passwordhashcur和使用者最初設定的密碼密文passwordhash是否一致,如果一致,則校驗成功,否則校驗失敗。
常用的密碼攻擊方式有字典攻擊、暴力破解、查表法、反向查表法、彩虹表等。
對字典攻擊和暴力破解,攻擊者均採用逐密碼嘗試的方式,目前沒有很好的手段來阻止字典攻擊和暴力破解攻擊,只能是想辦法讓這兩種攻擊方式變得相對低效一些,而相同的密碼產生不同的hash值便能讓攻擊者針對每乙個hash值都需要從頭進行嘗試,從而使攻擊變得更加低效。
對查表法、反向查表法和彩虹表攻擊方式,攻擊者需要提前準備好包含密碼和密碼hash值的密碼表,然後根據該錶和使用者密碼資料庫進行批量匹配,從而達到攻破密碼的目的;而如果我們在加密時,給每個密碼附加了不同的隨機值,這樣每個密碼對應的hash值也會不同,這樣攻擊者在準備密碼表時,就必須要將最基本的密碼和使用者密碼資料庫中的鹽值進行笛卡爾積後再計算hash值,鹽值越多,使用者需要準備的表量越大,這樣對於攻擊而言,就變得有些得不償失了。
加鹽的目的是為了增加攻擊者破解的難度,那麼在加鹽的時候要注意以下幾點,否則加鹽的意義也不會太大。
1)、鹽值不能太短;如果鹽值只有少數兩三位甚至一兩位的話,攻擊者完全可以窮舉所有可能的鹽值;關於鹽值長度的乙個經驗值是長度至少要和hash加密函式的返回值長度保持一致。
2)、鹽值不能固定;如果系統使用了固定的鹽值,那麼和不加鹽相當於是一回事了,攻擊者完全可以使用該固定的鹽值提前準備密碼表;另外,相同密碼對應的hash值仍然是一樣的,仍然無法對密碼相同這一事實進行掩飾。
3)、不要使用能提前預知的值作為鹽值;如果鹽值能提前得知或提前推斷出,攻擊者也完全可以根據提前預知的鹽值準備密碼表,從而對破解的難度也增加不了多少。
4)、每一次修改密碼重新計算hash值時,要重新生成新的鹽值,不要使用上次密碼對應的鹽值;因為如果使用者密碼洩露之後,鹽值相應的也就洩露了,使用者修改密碼時,如果還沿用原來的鹽值,攻擊者也仍然可以根據上次的鹽值提前準備密碼表,從而使攻破可能性變得更高了。
bcrypt是單向hash加密演算法,類似pbkdf2演算法 不可反向破解生成明文。
一、bcrypt是怎麼加密的?
bcrypt有四個變數:
saltrounds: 正數,代表hash雜湊次數,數值越高越安全,預設10次。
mypassword: 明文密碼字串。
salt: 鹽,乙個128bits隨機字串,22字元
myhash: 經過明文密碼password和鹽salt進行hash,個人的理解是預設10次下 ,迴圈加鹽hash10次,得到myhash
每次明文本串mypassword過來,就通過10次迴圈加鹽salt加密後得到myhash, 然後拼接bcrypt版本號+salt鹽+myhash等到最終的bcrypt密碼 ,存入資料庫中。
這樣同乙個密碼,每次登入都可以根據自省業務需要生成不同的myhash, myhash中包含了版本和salt,存入資料庫。
bcrypt密碼**:bcrypt加密後存入db中的加密串包含了 鹽 和 hash,不用單獨在儲存鹽
如spring security crypto 專案中實現的bcrypt方法加密:bcrypt.hashpw(mypassword, bcrypt.gensalt())
那即使黑客得到了bcrypt密碼,他也無法轉換明文,因為之前說了bcrypt是單向hash演算法
;
二、是如何驗證密碼的?
在下次校驗時,從myhash中取出salt,salt跟password進行hash;得到的結果跟儲存在db中的hash進行比對。
如spring security crypto 專案中實現的bcrypt 密碼驗證bcrypt.checkpw(candidatepassword, dbpassword)
鹽值加密介紹
簡單說就是為了使相同的密碼擁有不同的hash值的一種手段 就是鹽化 md5自身是不可逆的 但是目前網路上有很多資料庫支援反查詢 如果使用者密碼資料庫不小心被洩露 黑客就可以通過反查詢方式獲得使用者密碼 或者對於資料庫中出現頻率較高的hash碼 即很多人使用的 進行暴力破解 因為它通常都是弱口令 鹽值...
鹽值加密介紹
簡單說就是為了使相同的密碼擁有不同的hash值的一種手段 就是鹽化 md5自身是不可逆的 但是目前網路上有很多資料庫支援反查詢 如果使用者密碼資料庫不小心被洩露 黑客就可以通過反查詢方式獲得使用者密碼 或者對於資料庫中出現頻率較高的hash碼 即很多人使用的 進行暴力破解 因為它通常都是弱口令 鹽值...
鹽加密快速上手
一 鹽加密是什麼?加鹽加密是一種對系統登入口令的加密方式,它實現的方式是將每乙個口令同乙個叫做 鹽 salt 的n位隨機數相關聯。無論何時只要口令改變,隨機數就改變。隨機數以未加密的方式存放在口令檔案中,這樣每個人都可以讀。不再只儲存加密過的口令,而是先將口令和隨機數連線起來然後一同加密,加密後的結...