パスワードのハッシュ化とキーの導出: 秘密を安全な意味不明なものに変える、Go Crypto 8

Susan Sarandon
リリース: 2024-11-19 10:01:02
オリジナル
154 人が閲覧しました

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 は、1 つの秘密から複数の鍵を生成できる魔法の鍵工場のようなものです。さまざまな目的に複数のキーが必要な場合に最適です。使用方法は次のとおりです:

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 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート