やあ、暗号チャンピオン!パスワードのハッシュ化とキー導出の世界に飛び込む準備はできていますか?これらは、パスワードとキーを安全で読めない意味不明なものに変えるための秘密のレシピだと考えてください。 Go が暗号魔法を生み出すのにどのように役立つかを見てみましょう!
まず、パスワードのハッシュ化について話しましょう。それは、暗号化ブレンダーにパスワードを通すようなものです - 出てくるものは、入力されたものと全く似ていません、そしてそれはまさに私たちが望んでいることです!
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 は、あらゆるスーパーフードが入った新感覚のスムージーのようなものです。最新のパスワード クラッキング技術に対して特に耐性を持つように設計されています。使用方法は次のとおりです:
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 は、古くて信頼性の高いキー切断機のようなものです。それはあなたのパスワードを取得し、それをピカピカの新しいキーに変えます。その方法は次のとおりです:
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 は、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) }
あなたは秘密を安全な意味不明なものに変える達人になったので、心に留めておくべきいくつかの黄金律を以下に示します:
ジョブに適したツールを使用します: パスワードには、bcrypt または Argon2 を使用します。キーの導出には、PBKDF2 または HKDF を使用します。
好みのソルト: パスワードまたはキーごとに、常に一意のランダムなソルトを使用します。これは、各ハッシュを一意にする秘密の材料を追加するようなものです。
レシピを調整します: セキュリティのニーズとハードウェア機能に基づいて、適切な作業要素 (反復、メモリ コスト) を選択します。調理時間と温度を調整するようなものです
レシピを秘密にする: ソルトやその他のパラメータを安全に生成して保存します。あなたの秘密の材料を誰にも覗かれないようにしてください!
生のままでは提供しない: プレーン テキストのパスワードや暗号化キーを決して保存しないでください。常に適切にハッシュ化または派生して提供します。
タイミングがすべてです: パスワードを検証するときに定数時間比較関数を使用します。それは、パスワードが正しいか間違っているかにかかわらず、常に同じ時間をかけてチェックするようにするのと同じです。
トレンドを常に把握する: 選択したアルゴリズムとパラメーターを定期的に確認して更新します。暗号化はファッションのようなものです。今日安全なものでも明日は安全とは限りません。
おめでとうございます!あなたは秘密を安全な意味不明なものに変える技術を習得したところです。これらのテクニックは、アプリケーション内でパスワードとキーを安全に保つために非常に重要です。
暗号の世界では、これらの基本を理解することが重要であることを覚えておいてください。それは料理の基本的なレシピを学ぶようなものです - 一度これらを理解すれば、あらゆる種類の安全でおいしい暗号料理を作ることができます!
それでは、bcrypt を使用して安全なユーザー認証システムを実装してみてはいかがでしょうか?それとも、HKDF で派生したキーを使用してファイル暗号化ツールを作成しますか?安全なパスワード ストレージとキー管理の世界がすぐに利用できます。暗号シェフ、コーディングを楽しんでください!
以上がパスワードのハッシュ化とキーの導出: 秘密を安全な意味不明なものに変える、Go Crypto 8の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。