最簡單的使用者密碼儲存方式

2021-08-31 22:47:13 字數 2333 閱讀 9693

最簡單的使用者密碼儲存方式

使用者訪問**,在註冊時需要輸入使用者名稱和密碼,在僅考慮功能的前提下,可以把使用者名稱和密碼以明文的方式儲存在資料表中。

username

password

foobar

foobar#123456

當使用者登入時,直接使用使用者提供的明文密碼與資料庫中的密碼進行比對,如果相同則授權使用者登入。

面臨的安全問題 : 資料庫被竊取導致密碼洩露

明文密碼儲存方式在實現上非常簡單,但面臨的問題也很明顯:沒有任何安全防護機制,任何有權讀取資料庫的人都可以獲取所有使用者的密碼。因此我們需要一種即使資料檔案被竊取,竊取者也不能獲取使用者密碼的方式。

解決方式:使用單向hash方式雜湊使用者密碼

通過hash的方式,可以比較有效的降低密碼洩露的風險。 hash是把輸入的資料流通過特定的演算法處理後,輸出是乙個固定長度的字串。如」foobar#123456」經過md5之後,值為」1276563ea8d2c0ef9b04979d59f5d93e」, 把這個字串儲存到資料庫中替代密碼明文。

username

password

foobar

1276563ea8d2c0ef9b04979d59f5d93e

當使用者登入時,把使用者輸入的密碼經過md5之後與資料庫中的字串進行對比。

通過hash的處理,即使資料庫檔案被竊取,竊取者也不能直觀的獲取到foobar賬號的密碼是什麼。

hash的特點是單向的:由輸入流可以得到確定的輸出字串,但從輸出的字串反向獲取輸入流的代價極高,幾乎是不可能做到的。

常見的hash處理方式是md5, sha1, sha256, sha512 等。

簡單hash方式面臨的問題: rainbow攻擊

使用md5,sha1等hash防止直接對使用者密碼進行加密,是存在一定的隱患的。 竊取者可以通過rainbow的方式進行暴力破解。

rainbow的方式很簡單, 首先根據密碼所使用字元範圍和密碼長度構造出所有可能的密碼序列(稱為詞典),然後對這些密碼序列進行hash(如md5), 然後把hash後的字串與資料庫中的password欄位進行對比。 這樣可以非常快速的比對到foobar賬號的真實密碼是什麼。有測試表明,破解乙個7位長度,有a-z,a-z,0-9構造出來的密碼,只需要不到40秒的時間就可以了, 非常快。

改進的hash處理方式:對抗rainbow攻擊

讓使用者使用更長,含有更多特殊字元的密碼

如讓使用者必須使用含有數字、大小寫字母,甚至包括!@#$% ^&*( 這種特殊字元的密碼。這種方式能提高rainbow攻擊的hash詞典的構造時間和比對時間,但由於以下兩個原因,不建議過度使用該方式。

a. 由於現在cpu的計算能力極為強大,詞典的構造時間並不是關鍵因素

b. 複雜的密碼使用者很難記憶,使用者體驗太差

使用更高長位的hash方式

相比於md5和sha1,可以使用sha256或者sha512的方式,更長的hash串意味著攻擊者需要花費更多的時間準備詞典。但基於cpu計算能力的強大,這種方式的安全性仍然不足。

使用salt進行hash

謂salt,其實是乙個普通的字串。在對密碼進行hash之前,先把這個字串與密碼連線起來。如作為明文密碼的字首或者字尾,然後對新的字串進行hash操作。 salt通常儲存在**中,這樣即使資料庫檔案丟失,只要**原始檔不丟失,攻擊者是沒有辦法獲取原始密碼的。

使用速度較慢的hash方式

md5,shax系列的方式,都是通過優化的演算法,每次的計算都極為迅速,攻擊者準備攻擊詞典的時間也就大大的縮短。因此我們可以選擇較慢的hash方式,如bcrypt。

bcrypt是一種基於blowfish算命的hash方式,其特點是設計者可以根據選擇hash的時間消耗。 如設定高等級的時間消耗,一次bcrypt甚至可以需要300毫秒才能計算完畢,而通常的md5甚至不需要1毫秒。 這樣可以讓攻擊者的詞典準備時間延長300倍,極大的增加了攻擊時間成本。

完美的解決方案

使用bcrypt慢hash方法

為每個使用者的hash過程提供salt

使用全域性salt

通過這三個步驟, 密碼的生成過程可這樣表示 :

$hashpasswd = hash( $global_salt + hash(cleartext_password + $user_only_salt));

推薦的解決方案

基於時間成本、專案複雜度和安全讀需求,常規web類專案的推薦解決方案如下

使用md5或者sha1

為每個使用者的hash過程提供salt

使用全域性salt

密碼的生成過程為:

$hashpasswd = sha1( $global_salt + sha1(cleartext_password + $user_only_salt));

5種使用者密碼加密方式,哪種最安全?

作為網際網路公司的資訊保安從業人員經常要處理撞庫掃號事件 撞庫是黑客無聊的 惡作劇 黑客通過收集網際網路已洩露的使用者 密碼資訊,生成對應的字典表,嘗試批量登陸其他 後,得到一系列可以登陸的使用者 產生撞庫掃號的根本原因是一些企業發生了資訊洩露事件,且這些洩露資料未加密或者加密方式比較弱,導致黑客可...

最簡單的儲存過程

僅為個人理解,有空請參觀迷戀自留地 exists用於檢查子查詢是否至少會返回一行資料,該子查詢實際上並不返回任何資料,而是返回值true或false 建立儲存過程 create proc asd as select from dbo t activityclassify 判斷儲存過程是否存在if e...

vim最簡單的補全方式

早就知道vim的ypm,但是覺得配置簡直太磨人了,本著夠用好用就行的原則,找到了vim auto popmenu,想要配置簡單的同學,可以直接c c,c v即可,對配置檔案有潔癖的同學請看官方 0 原生自動補全 其實vim本身自帶自動補全,但是不知道什麼原因,自動補全不是自動彈出的那種,能從當前檔案...