<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [TOC] # 簡介 最近正在遷移自己的小項目,項目之前是基于**Laravel5.5**開發的。整個用戶登陸也是基于框架的 Auth 包認證的。其中用戶密碼這塊也是用到了`PHP`內置的函數`password_hash`,用它進行密碼加密。而且 PHP 默認使用的 PASSWORD\_BCRYPT 算法。在使用 Go 的遷移過程中需要認證密碼,所以就把這個過程記錄下來。使用下面的例子來說明如何使用 GO[bcrypt](https://godoc.org/golang.org/x/crypto/bcrypt)包來對你的密碼進行 hash 和 salt 加密 對于這個例子,我將創建一個控制臺應用程序,用于演示如何獲取用戶輸入的密碼并使用它生成 salt 哈希值。 完成此操作后,我將通過比較密碼與其散列版本來驗證密碼是否正確。 # 獲取用戶輸入的密碼 開始我們先創建一個可以在控制臺讀取用戶輸入的的方法。 ~~~go func getPwd() []byte { fmt.Println("Enter a password") var pwd string // 讀取用戶輸入 _, err := fmt.Scan(&pwd) if err != nil { log.Println(err) } return []byte(pwd) } ~~~ # Hash & Salt 用戶的密碼 現在我們可以使用 Go 的?[bcrypt](https://godoc.org/golang.org/x/crypto/bcrypt)?包提供的`GenerateFromPassword(password []byte, cost int)([]byte, error)`方法對用戶的密碼進行 hash 和 salt 加密了。 > GenerateFromPassword 方法以給定 cost 值返回密碼的 Bcrypt 算法的 Hash 值,如果提供的 cost 值小于 Mincost 的話,將會默認使用 DefaultCost 代替 > > 使用`GenerateFromPassword`函數的一個優勢就是我們不需要自己來編寫函數來生成 Salt,因為它會為我們自動生成一個 Salt。 下面的函數使用`GenerateFromPassword`生成 salted 哈希值,該哈希值作為字節切片返回。 然后我們將字節切片作為字符串返回,以便我們可以將 salted 哈希存儲在數據庫中作為用戶密碼。 ~~~go func hashAndSalt(pwd []byte) string { hash, err := bcrypt.GenerateFromPassword(pwd, bcrypt.MinCost) if err != nil { log.Println(err) } return string(hash) } ~~~ # 目前我們做了什么 到目前為止,我們已經創建了一個接受來自控制臺的用戶輸入并將其作為字節切片返回的函數。 然后, 我們再創建一個可以接收用戶輸入并返回 salted 哈希值的函數。下面就是代碼事例。 ~~~go package main import ( "fmt" "log" "golang.org/x/crypto/bcrypt" ) func main() { for { pwd := getPwd() hash := hashAndSalt(pwd) fmt.Println("Salted Hash", pwd) } } ~~~ 如果你運行上面的代碼,將會得到下面的結果 ~~~go > $ Enter a password > $ foobar > Salted Hash $2a$10$........... ~~~ 這里需要的注意的是我使用 for 循環調用函數,直到我強制停止它。對于那些不熟悉 GO 的人來講,這個就和其他語言的`while (true){}`是一樣的效果。 # 驗證密碼 最后一件事兒就是需要驗證密碼的正確性來登陸我們的系統,我們可以使用[bcrypt](https://godoc.org/golang.org/x/crypto/bcrypt)?包提供的`CompareHashAndPassword(hashedPassword, password []byte) error`函數 > CompareHashAndPassword 將 bcrypt 哈希密碼與其純文本進行比較。 成功時返回 nil,失敗時返回錯誤 > > 我們使用`CompareHashAndPassword`函數來創建另一個返回 bool 值的函數讓我們知道密碼是否匹配。 ~~~go func comparePasswords(hashedPwd string, plainPwd []byte) bool { byteHash := []byte(hashedPwd) err := bcrypt.CompareHashAndPassword(byteHash, plainPwd)\ if err != nil { log.Println(err) return false } return true } ~~~ # 更新 Main 函數 我們現在可以更新我們的主要功能,以便我們能夠輸入密碼,獲取其鹽漬哈希,然后再次輸入密碼,并查明我們的第二個密碼是否與我們輸入的第一個密碼相匹配。 我們現在修改一個 main 函數,當我們輸入密碼的時候,獲取 salted 哈希值,然后再次輸入密碼,來檢查我們的密碼是否匹配。 ~~~go func main() { for { pwd := getPwd() hash := hashAndSalt(pwd) pwd2 := getPwd() pwdMatch := comparePasswords(hash, pwd2) fmt.Println("Passwords Match?", pwd) } } ~~~ # 全部代碼 ~~~go package main import ( "fmt" "log" "golang.org/x/crypto/bcrypt" ) func main() { for { // 輸入密碼 獲取 hash 值 pwd := getPwd() hash := hashAndSalt(pwd) // 再次輸入密碼驗證 pwd2 := getPwd() pwdMatch := comparePasswords(hash, pwd2) fmt.Println("Passwords Match?", pwd) } } func getPwd() []byte { fmt.Println("Enter a password") var pwd string _, err := fmt.Scan(&pwd) if err != nil { log.Println(err) } return []byte(pwd) } func hashAndSalt(pwd []byte) string { hash, err := bcrypt.GenerateFromPassword(pwd, bcrypt.MinCost) if err != nil { log.Println(err) } return string(hash) } func comparePasswords(hashedPwd string, plainPwd []byte) bool { byteHash := []byte(hashedPwd) err := bcrypt.CompareHashAndPassword(byteHash, plainPwd) if err != nil { log.Println(err) return false } return true } ~~~ 以上便是 GO 轉 php 的加密函數的過程,如果有任何錯誤或者不當的地方歡迎進行改進
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看