<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>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] ## 普通方案 ``` //import "crypto/sha256" h := sha256.New() io.WriteString(h, "His money is twice tainted: 'taint yours and 'taint mine.") fmt.Printf("% x", h.Sum(nil)) //import "crypto/sha1" h := sha1.New() io.WriteString(h, "His money is twice tainted: 'taint yours and 'taint mine.") fmt.Printf("% x", h.Sum(nil)) //import "crypto/md5" h := md5.New() io.WriteString(h, "需要加密的密碼") fmt.Printf("%x", h.Sum(nil)) ``` 1. 同一個密碼進行單向哈希,得到的總是唯一確定的摘要。 2. 計算速度快。隨著技術進步,一秒鐘能夠完成數十億次單向哈希計算。 單向哈希有兩個特性: 1. 同一個密碼進行單向哈希,得到的總是唯一確定的摘要。 2. 計算速度快。隨著技術進步,一秒鐘能夠完成數十億次單向哈希計算。 結合上面兩個特點,考慮到多數人所使用的密碼為常見的組合,攻擊者可以將所有密碼的常見組合進行單向哈希,得到一個摘要組合, 然后與數據庫中的摘要進行比對即可獲得對應的密碼。這個摘要組合也被稱為`rainbow table` ## 進階方案-加鹽 ``` //import "crypto/md5" //假設用戶名abc,密碼123456 h := md5.New() io.WriteString(h, "需要加密的密碼") //pwmd5等于e10adc3949ba59abbe56e057f20f883e pwmd5 :=fmt.Sprintf("%x", h.Sum(nil)) //指定兩個 salt: salt1 = @#$% salt2 = ^&*() salt1 := "@#$%" salt2 := "^&*()" //salt1+用戶名+salt2+MD5拼接 io.WriteString(h, salt1) io.WriteString(h, "abc") io.WriteString(h, salt2) io.WriteString(h, pwmd5) last :=fmt.Sprintf("%x", h.Sum(nil)) ``` ## 專家方案 上面的進階方案在幾年前也許是足夠安全的方案,因為攻擊者沒有足夠的資源建立這么多的`rainbow table`。 但是,時至今日,因為并行計算能力的提升,這種攻擊已經完全可行 這里推薦`scrypt`方案,scrypt是由著名的FreeBSD黑客Colin Percival為他的備份服務Tarsnap開發的。 目前Go語言里面支持的庫 https://github.com/golang/crypto/tree/master/scrypt ``` // DO NOT use this salt value; generate your own random salt. 8 bytes is // a good length. salt := []byte{0xc8, 0x28, 0xf2, 0x58, 0xa7, 0x6a, 0xad, 0x7b} dk,err := scrypt.Key([]byte("some password"), salt, 16384, 8, 1, 32) if err != nil { panic(err) } fmt.Printf("%+v\n", base64.StdEncoding.EncodeToString(dk)) ```
                  <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>

                              哎呀哎呀视频在线观看