Maison >développement back-end >Golang >Les commandements de la cryptographie : bonnes pratiques et pièges à éviter, Go Crypto 10
Hé là, croisé crypto ! Vous avez appris les outils du métier, mais il est maintenant temps de maîtriser l’art de les manier. Examinons les meilleures pratiques et les pièges courants liés à l'utilisation du package cryptographique de Go. Considérez cela comme vos commandements cryptographiques : suivez-les et vous serez sur la bonne voie vers l'illumination cryptographique !
Tenez-vous-en aux algorithmes éprouvés. C'est comme cuisiner : utilisez les recettes qui ont résisté à l'épreuve du temps !
// Good: Using the cryptographic equivalent of grandma's secret recipe import "crypto/aes" import "crypto/cipher" block, _ := aes.NewCipher(key) aesgcm, _ := cipher.NewGCM(block) ciphertext := aesgcm.Seal(nil, nonce, plaintext, nil)
Traitez vos clés comme les joyaux de la couronne : générez-les en toute sécurité, stockez-les en toute sécurité et faites-les pivoter régulièrement.
import "crypto/rand" // Generating a key fit for a king (or queen) key := make([]byte, 32) // 256-bit key _, err := rand.Read(key) if err != nil { panic("The royal key generator has failed us!") }
En matière de crypto, crypto/rand est votre meilleur ami. C'est comme avoir un dé parfaitement équilibré avec un milliard de faces.
import "crypto/rand" nonce := make([]byte, 12) if _, err := rand.Read(nonce); err != nil { panic("The universe has run out of randomness!") }
Vérifiez toujours les erreurs, mais soyez mystérieux sur les détails. C'est comme être un agent secret : reconnaissez que la mission a échoué, mais ne révélez pas pourquoi.
ciphertext, err := aesgcm.Seal(nil, nonce, plaintext, nil) if err != nil { log.Printf("Mission failed: %v", err) return errors.New("the secret message could not be encoded") }
Utilisez subtil.ConstantTimeCompare pour des comparaisons sensibles. C'est comme avoir un visage de poker pour votre code.
import "crypto/subtle" if subtle.ConstantTimeCompare(receivedMAC, computedMAC) != 1 { return errors.New("the secret handshake was incorrect") }
Utilisez bcrypt ou Argon2 pour le hachage du mot de passe. C'est comme utiliser une machine à remonter le temps pour que le piratage de mots de passe prenne des siècles.
import "golang.org/x/crypto/bcrypt" hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) if err != nil { panic("Our password blender is broken!") }
Vérifiez toujours ces passeports numériques (certificats). C'est comme être un videur très minutieux dans un club crypto exclusif.
config := &tls.Config{ RootCAs: certPool, VerifyPeerCertificate: func(rawCerts [][]byte, verifiedChains [][]*x509.Certificate) error { // Implement additional checks here return nil }, }
Réutiliser des noms occasionnels, c'est comme utiliser deux fois le même déguisement en tant qu'agent secret - cela fait sauter votre couverture !
// Bad: Reusing your disguise // nonce := make([]byte, 12) // ... use same nonce for multiple missions // Good: A fresh disguise for every mission nonce := make([]byte, 12) _, err := rand.Read(nonce)
Utiliser le mode BCE, c'est comme utiliser une enveloppe transparente pour vos messages secrets.
// Bad: Using the see-through envelope (ECB mode) // This is just for illustration; Go doesn't even provide ECB mode directly // Good: Using the proper secret envelope (GCM mode) aesgcm, _ := cipher.NewGCM(block) ciphertext := aesgcm.Seal(nil, nonce, plaintext, nil)
Le cryptage sans authentification, c'est comme envoyer une lettre sans sceau : n'importe qui pourrait la falsifier !
// Bad: Sending unsealed letters // stream := cipher.NewCTR(block, iv) // stream.XORKeyStream(ciphertext, plaintext) // Good: Properly sealed secret messages aesgcm, _ := cipher.NewGCM(block) ciphertext := aesgcm.Seal(nil, nonce, plaintext, nil)
Ignorer les erreurs, c'est comme ignorer le voyant « Check Engine » sur votre voiture de fuite.
// Bad: Ignoring the warning lights // plaintext, _ := aesgcm.Open(nil, nonce, ciphertext, nil) // Good: Paying attention to all the warning lights plaintext, err := aesgcm.Open(nil, nonce, ciphertext, nil) if err != nil { return nil, errors.New("our secret decoder ring has failed") }
Utiliser des algorithmes faibles, c'est comme utiliser un cadenas papier sur votre coffre-fort secret.
// Good: Using the cryptographic equivalent of grandma's secret recipe import "crypto/aes" import "crypto/cipher" block, _ := aes.NewCipher(key) aesgcm, _ := cipher.NewGCM(block) ciphertext := aesgcm.Seal(nil, nonce, plaintext, nil)
Utiliser des valeurs « aléatoires » prévisibles, c'est comme utiliser « mot de passe 123 » comme code secret.
import "crypto/rand" // Generating a key fit for a king (or queen) key := make([]byte, 32) // 256-bit key _, err := rand.Read(key) if err != nil { panic("The royal key generator has failed us!") }
Ne pas mettre à jour vos bibliothèques de chiffrement, c'est comme utiliser les techniques de cryptage du siècle dernier pour protéger les secrets d'aujourd'hui.
N'oubliez pas, jeune crypto-padawan, exercer le pouvoir de la cryptographie est une grande responsabilité. Suivez ces commandements, évitez ces péchés et vous serez sur la bonne voie pour devenir un véritable maître de la cryptographie.
Mais rappelez-vous toujours : la cryptographie est complexe, et même les maîtres demandent parfois conseil. En cas de doute, consultez les anciens de la crypto (experts en sécurité) ou fiez-vous aux textes sacrés (bibliothèques cryptographiques bien établies et de haut niveau).
Maintenant, allez-y, cryptez, hachez et signez en toute confiance ! Que la crypto soit avec vous !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!