Heim >Backend-Entwicklung >Golang >Krypto mit Go-Geschwindigkeit: Leistungsüberlegungen, Go Crypto 11
Hey, Geschwindigkeitsdämon! Sind Sie bereit, Ihre Krypto-Operationen voranzutreiben? Während Sicherheit in der Welt der Kryptografie für uns oberste Priorität hat, muss unser sicherer Code manchmal wie ein fein abgestimmter Sportwagen laufen. Lassen Sie uns untersuchen, wie wir unsere Krypto-Operationen in Go! vergleichen und optimieren können.
Go verfügt über eine integrierte Stoppuhr für unser Krypto-Rennen. So können wir unsere kryptografischen Sprints zeitlich festlegen:
package main import ( "crypto/aes" "crypto/cipher" "crypto/rand" "crypto/rsa" "crypto/sha256" "testing" ) func BenchmarkAESEncryption(b *testing.B) { key := make([]byte, 32) rand.Read(key) block, _ := aes.NewCipher(key) gcm, _ := cipher.NewGCM(block) nonce := make([]byte, gcm.NonceSize()) plaintext := make([]byte, 1024) // 1KB of secret message b.ResetTimer() for i := 0; i < b.N; i++ { gcm.Seal(nil, nonce, plaintext, nil) } } func BenchmarkSHA256(b *testing.B) { data := make([]byte, 1024) // 1KB of data to hash b.ResetTimer() for i := 0; i < b.N; i++ { sha256.Sum256(data) } } func BenchmarkRSAEncryption(b *testing.B) { privateKey, _ := rsa.GenerateKey(rand.Reader, 2048) publicKey := &privateKey.PublicKey message := make([]byte, 32) // A small secret message b.ResetTimer() for i := 0; i < b.N; i++ { rsa.EncryptPKCS1v15(rand.Reader, publicKey, message) } }
Um diese Krypto-Rennen durchzuführen, verwenden Sie:
go test -bench=.
Es ist, als hätten Sie eine Radarpistole für Ihre Krypto-Operationen!
Das Kryptopaket von Go ist wie ein intelligenter Rennwagen – es nutzt automatisch spezielle Hardwarefunktionen, sofern verfügbar. Dazu gehört:
Möchten Sie sehen, welche Turbolader Ihre CPU hat? Versuchen Sie Folgendes:
GODEBUG=cpu.all=1 go run myprogram.go
Es ist, als würden Sie die Haube Ihrer CPU öffnen, um zu sehen, welche speziellen Krypto-Engines sie hat!
Verschiedene Krypto-Algorithmen sind wie verschiedene Arten von Rennwagen. Lasst uns ein Rennen veranstalten:
func BenchmarkAES(b *testing.B) { /* ... */ } func BenchmarkChaCha20(b *testing.B) { /* ... */ } func BenchmarkRSA2048(b *testing.B) { /* ... */ } func BenchmarkECDSAP256(b *testing.B) { /* ... */ } func BenchmarkSHA256(b *testing.B) { /* ... */ } func BenchmarkSHA3_256(b *testing.B) { /* ... */ }
Führen Sie diese aus und Sie werden sehen, welches Krypto-Auto auf Ihrer speziellen Strecke (Hardware) am schnellsten ist!
AES-GCM ist Ihr Formel-1-Auto: Für die symmetrische Verschlüsselung ist es sowohl sicher als auch blitzschnell, insbesondere mit AES-NI.
Elliptische Kurven sind Ihre Rallye-Autos: Bei asymmetrischen Einsätzen übertreffen ECDSA und ECDH oft den RSA-Lkw.
Verwenden Sie Ihre Engines erneut: Das Erstellen von Chiffrierobjekten ist wie das Aufwärmen einer Engine. Machen Sie es einmal und verwenden Sie es dann für mehrere Runden:
block, _ := aes.NewCipher(key) gcm, _ := cipher.NewGCM(block) // Reuse 'gcm' for multiple encryptions
Passen Sie Ihren Motor richtig an: Größer ist nicht immer besser. Verwenden Sie die kleinste Schlüsselgröße, die Ihren Sicherheitsanforderungen entspricht.
Stapelverarbeitung ist wie Entwurf: Wenn Sie viele kleine Kryptooperationen durchführen, stapeln Sie sie, um den Overhead zu reduzieren.
Verwenden Sie alle Ihre Zylinder: Die Parallelität von Go ist so, als ob Sie mehrere Motoren hätten. Verwenden Sie sie für parallele Kryptooperationen:
package main import ( "crypto/aes" "crypto/cipher" "crypto/rand" "crypto/rsa" "crypto/sha256" "testing" ) func BenchmarkAESEncryption(b *testing.B) { key := make([]byte, 32) rand.Read(key) block, _ := aes.NewCipher(key) gcm, _ := cipher.NewGCM(block) nonce := make([]byte, gcm.NonceSize()) plaintext := make([]byte, 1024) // 1KB of secret message b.ResetTimer() for i := 0; i < b.N; i++ { gcm.Seal(nil, nonce, plaintext, nil) } } func BenchmarkSHA256(b *testing.B) { data := make([]byte, 1024) // 1KB of data to hash b.ResetTimer() for i := 0; i < b.N; i++ { sha256.Sum256(data) } } func BenchmarkRSAEncryption(b *testing.B) { privateKey, _ := rsa.GenerateKey(rand.Reader, 2048) publicKey := &privateKey.PublicKey message := make([]byte, 32) // A small secret message b.ResetTimer() for i := 0; i < b.N; i++ { rsa.EncryptPKCS1v15(rand.Reader, publicKey, message) } }
Denken Sie daran, Krypto-Rennfahrer: Während Geschwindigkeit aufregend ist, steht Sicherheit an erster Stelle. Verzichten Sie nicht auf Sicherheit für ein paar Millisekunden Geschwindigkeit. Der beste Kryptocode ist wie ein gut konstruiertes Rennauto: schnell, aber auch sicher und zuverlässig.
Testen Sie Ihren Kryptocode immer auf einer Hardware, die der ähnelt, die Sie in der realen Welt verwenden. Unterschiedliche Spuren (Hardware) können zu sehr unterschiedlichen Ergebnissen führen!
Und denken Sie daran, manchmal ist die einfachste und unkomplizierteste Implementierung die beste. Überoptimieren Sie nicht, es sei denn, Sie müssen es wirklich müssen – eine vorzeitige Optimierung ist wie das Anbringen eines Spoilers an einem Fahrrad!
Jetzt drehen Sie die Krypto-Engines auf Hochtouren und möge Ihr sicherer Code wie der Wind fliegen! Viel Spaß beim Rennen, Krypto-Geschwindigkeitsdämon!
Das obige ist der detaillierte Inhalt vonKrypto mit Go-Geschwindigkeit: Leistungsüberlegungen, Go Crypto 11. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!