首頁 > 後端開發 > Golang > 主體

密碼雜湊和金鑰派生:將秘密變成安全的亂碼,Go Crypto 8

Susan Sarandon
發布: 2024-11-19 10:01:02
原創
176 人瀏覽過

Password Hashing and Key Derivation: Turning Secrets into Secure Gibberish, Go Crypto 8

嘿,加密貨幣冠軍!準備好深入密碼雜湊和金鑰派生的世界了嗎?將這些視為將密碼和金鑰變成安全、不可讀的亂碼的秘訣。讓我們看看 Go 如何幫助我們創造一些加密魔法!

密碼哈希:使密碼不可讀(甚至對我們來說也是如此!)

首先,我們來談談密碼雜湊。這就像將密碼放入加密混合器中 - 結果看起來與輸入的完全不同,而這正是我們想要的!

Bcrypt:經典密碼冰沙

Bcrypt 就像密碼雜湊的經典冰沙 - 經過嘗試、測試,仍然美味。使用方法如下:

import (
    "fmt"
    "golang.org/x/crypto/bcrypt"
)

func main() {
    password := []byte("iLoveCrypto123")

    // Let's blend this password!
    hashedPassword, err := bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost)
    if err != nil {
        panic("Our cryptographic blender broke!")
    }

    fmt.Printf("Our password smoothie: %x\n", hashedPassword)

    // Now, let's see if we can recognize our original password
    err = bcrypt.CompareHashAndPassword(hashedPassword, password)
    if err != nil {
        fmt.Println("Nope, that's not our password!")
    } else {
        fmt.Println("Yep, that's our password alright!")
    }
}
登入後複製

Argon2:更新、更精緻的冰沙

Argon2 就像包含所有超級食物的新型冰沙 - 它的設計對現代密碼破解技術具有額外的抵抗力。使用方法如下:

import (
    "crypto/rand"
    "encoding/base64"
    "fmt"
    "golang.org/x/crypto/argon2"
)

func main() {
    password := []byte("iLoveCryptoEvenMore456")

    // First, let's add some salt to our smoothie
    salt := make([]byte, 16)
    if _, err := rand.Read(salt); err != nil {
        panic("Our salt shaker is empty!")
    }

    // Now, let's blend our password
    timeCost := uint32(1)
    memoryCost := uint32(64 * 1024)
    threads := uint8(4)
    keyLength := uint32(32)

    hash := argon2.IDKey(password, salt, timeCost, memoryCost, threads, keyLength)

    // Let's encode our smoothie and salt for storage
    encodedHash := base64.RawStdEncoding.EncodeToString(hash)
    encodedSalt := base64.RawStdEncoding.EncodeToString(salt)

    fmt.Printf("Our fancy password smoothie: %s\n", encodedHash)
    fmt.Printf("Our salt: %s\n", encodedSalt)

    // To verify, we'd need to decode the salt, reblend with the same recipe, and compare
}
登入後複製

金鑰派生:將密碼轉換為加密金鑰

現在,我們來談談金鑰派生。這就像將簡單的密碼變成可以解鎖我們的加密寶藏的複雜密鑰。

PBKDF2:經典鑰匙製作器

PBKDF2 就像一台古老、可靠的鑰匙切割機。它會獲取您的密碼並將其變成閃亮的新密鑰。方法如下:

import (
    "crypto/rand"
    "crypto/sha256"
    "encoding/base64"
    "fmt"
    "golang.org/x/crypto/pbkdf2"
)

func main() {
    password := []byte("OpenSesame123")

    // Let's add some randomness to our key-making process
    salt := make([]byte, 16)
    if _, err := rand.Read(salt); err != nil {
        panic("Our randomness generator broke!")
    }

    // Time to make our key
    iterations := 100000
    keyLength := 32
    key := pbkdf2.Key(password, salt, iterations, keyLength, sha256.New)

    // Let's encode our new key and salt
    encodedKey := base64.RawStdEncoding.EncodeToString(key)
    encodedSalt := base64.RawStdEncoding.EncodeToString(salt)

    fmt.Printf("Our shiny new key: %s\n", encodedKey)
    fmt.Printf("The salt we used: %s\n", encodedSalt)
}
登入後複製

HKDF:關鍵工廠

HKDF 就像一個神奇的鑰匙工廠,可以從一個秘密中生產多個鑰匙。當您需要多把鑰匙用於不同目的時,它是完美的選擇。使用方法如下:

import (
    "crypto/sha256"
    "encoding/base64"
    "fmt"
    "golang.org/x/crypto/hkdf"
    "io"
)

func main() {
    secret := []byte("MySuper
SecretValue")
    salt := []byte("SaltySalt")
    info := []byte("KeyForEncryption")

    // Let's start up our key factory
    keyFactory := hkdf.New(sha256.New, secret, salt, info)

    // Now, let's produce two 32-byte keys
    key1 := make([]byte, 32)
    key2 := make([]byte, 32)

    if _, err := io.ReadFull(keyFactory, key1); err != nil {
        panic("Our key factory had a malfunction!")
    }
    if _, err := io.ReadFull(keyFactory, key2); err != nil {
        panic("Our key factory is tired and can't make another key!")
    }

    // Let's encode our new keys
    encodedKey1 := base64.RawStdEncoding.EncodeToString(key1)
    encodedKey2 := base64.RawStdEncoding.EncodeToString(key2)

    fmt.Printf("Our first key: %s\n", encodedKey1)
    fmt.Printf("Our second key: %s\n", encodedKey2)
}
登入後複製

密碼雜湊和金鑰派生的黃金規則

既然您是把秘密變成安全胡言亂語的大師,請記住以下一些黃金法則:

  1. 使用正確的工具來完成工作:對於密碼,請使用 bcrypt 或 Argon2。對於金鑰派生,請使用 PBKDF2 或 HKDF。

  2. 鹽調味:始終為每個密碼或密鑰使用唯一的隨機鹽。這就像添加一種秘密成分,使每個哈希都獨一無二。

  3. 調整您的配方:根據您的安全需求和硬體功能選擇適當的工作因素(迭代、記憶體成本)。就像調整烹飪時間和溫度一樣。

  4. 保密您的配方:安全地產生並儲存您的鹽和其他參數。不要讓任何人偷看你的秘密成分!

  5. 切勿提供原始服務:切勿儲存純文字密碼或加密金鑰。始終為它們提供經過良好雜湊處理或派生的服務。

  6. 時間就是一切:驗證密碼時使用恆定時間比較函數。這就像確保您始終花相同的時間檢查密碼,無論它是對還是錯。

  7. 跟上趨勢:定期檢視並更新您選擇的演算法和參數。密碼學就像時尚 - 今天安全的明天可能就不安全了!

接下來是什麼?

恭喜!您剛剛掌握了將秘密變成安全的胡言亂語的藝術。這些技術對於確保應用程式中的密碼和金鑰安全至關重要。

請記住,在密碼學領域,理解這些基礎知識至關重要。這就像學習烹飪的基本食譜 - 一旦你掌握了這些,你就可以創造出各種安全、美味的加密菜餚!

那麼,您嘗試使用 bcrypt 實現安全的使用者驗證系統呢?或者也許可以使用 HKDF 衍生的金鑰來建立檔案加密工具?安全密碼儲存和金鑰管理的世界觸手可及!祝你程式設計愉快,加密廚師!

以上是密碼雜湊和金鑰派生:將秘密變成安全的亂碼,Go Crypto 8的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板