不少系統都是將密碼進行一次 MD5 或 SHA1 Hash後存入數據庫中。這樣的密碼抵擋不住字典攻擊。所謂字典攻擊,就是將經常使用密碼進行Hash後作成一個字典,破解的時候,只須要查字典就能知道對應的明文密碼。golang
爲了抵禦字典攻擊,推薦的作法是使用 密碼 + 鹽(一串隨機數) 再Hash的方式。每一個密碼對應一個不一樣的隨機數。這個方法,其實是將密碼人爲地拓展了N位,致使密碼長度大增,使得攻擊者沒法構造這麼大的一個字典。正則表達式
Go語言提供了一種較爲安全的加密方式,使用GoLang golang.org/x/crypto/bcrypt 模塊,經過該模塊能夠快速實現密碼的存儲處理。數據庫
package main import ( "fmt" "golang.org/x/crypto/bcrypt" ) type User struct { Name string `json:"name"` Password string `json:"password"` } func main() { fmt.Println("====模擬註冊====") u0 := User{} u0.Password = "pwd" //模擬註冊是傳遞的密碼 hash, err := bcrypt.GenerateFromPassword([]byte(u0.Password), bcrypt.DefaultCost) //加密處理 if err != nil { fmt.Println(err) } encodePWD := string(hash) // 保存在數據庫的密碼,雖然每次生成都不一樣,只需保存一份便可 fmt.Println(encodePWD) fmt.Println("====模擬登陸====") u1:=User{} u1.Password=encodePWD //模擬從數據庫中讀取到的 通過bcrypt.GenerateFromPassword處理的密碼值 loginPwd:="pwd" //用戶登陸時輸入的密碼 // 密碼驗證 err = bcrypt.CompareHashAndPassword([]byte(u1.Password), []byte(loginPwd)) //驗證(對比) if err != nil { fmt.Println("pwd wrong") } else { fmt.Println("pwd ok") } }
運行效果:json
第一次運行:安全
第二次運行:加密
說明:每次運行,計算的密碼值都不一樣。所以使用GoLang golang.org/x/crypto/bcrypt 模塊對密碼進行處理,能夠避免字典攻擊。spa
附:密碼強弱的判斷
方法1:正則表達式判斷(長度、大小寫、特殊字符)code
方法2:創建一個若密碼錶,依據表中的密碼判斷是否爲若密碼blog
注:以上2種方法能夠結合使用string