Hash-Algorithmen in Go
Standardbibliothek für Hash-Pakete
Go bietet mehrere Hash-Algorithmen über Pakete der Standardbibliothek:
graph TD
A[Go Hash Packages] --> B[crypto/md5]
A --> C[crypto/sha1]
A --> D[crypto/sha256]
A --> E[crypto/sha512]
A --> F[crypto/sha3]
Implementierung gängiger Hash-Algorithmen
SHA-256-Hash
package main
import (
"crypto/sha256"
"fmt"
)
func computeSHA256(data string) string {
hash := sha256.Sum256([]byte(data))
return fmt.Sprintf("%x", hash)
}
func main() {
message := "Hello, LabEx!"
hashValue := computeSHA256(message)
fmt.Println("SHA-256 Hash:", hashValue)
}
MD5-Hash (nicht für Sicherheitsanwendungen empfohlen)
package main
import (
"crypto/md5"
"fmt"
)
func computeMD5(data string) string {
hash := md5.Sum([]byte(data))
return fmt.Sprintf("%x", hash)
}
func main() {
message := "Hello, LabEx!"
hashValue := computeMD5(message)
fmt.Println("MD5 Hash:", hashValue)
}
Vergleich von Hash-Algorithmen
Algorithmus |
Ausgabelänge |
Sicherheitsstufe |
Leistung |
MD5 |
128 Bits |
Niedrig |
Schnell |
SHA-1 |
160 Bits |
Niedrig |
Mittel |
SHA-256 |
256 Bits |
Hoch |
Mittel |
SHA-512 |
512 Bits |
Sehr hoch |
Langsamer |
Fortgeschrittene Hashing-Techniken
Salted Hashes (gesalzene Hashwerte)
package main
import (
"crypto/sha256"
"encoding/hex"
)
func saltedHash(password, salt string) string {
data := password + salt
hash := sha256.Sum256([]byte(data))
return hex.EncodeToString(hash[:])
}
func main() {
password := "mySecurePassword"
salt := "randomSalt123"
hashedPassword := saltedHash(password, salt)
}
Best Practices (bewährte Verfahren)
- Verwenden Sie für die meisten Anwendungen SHA-256 oder SHA-3.
- Verwenden Sie immer Salzen (Hinzufügen eines zufälligen Strings) beim Speichern von Passwörtern.
- Vermeiden Sie MD5 und SHA-1 bei sicherheitskritischen Aufgaben.
- Erwägen Sie die Verwendung von bcrypt für die Passwort-Hashing.
Überlegungen zur Leistung
graph LR
A[Input Data] --> B{Hash Algorithm}
B --> |MD5| C[Fastest]
B --> |SHA-256| D[Balanced]
B --> |SHA-512| E[Most Secure, Slowest]
Fehlerbehandlung beim Hashing
package main
import (
"crypto/sha256"
"fmt"
)
func safeHashCompute(data []byte) (string, error) {
if len(data) == 0 {
return "", fmt.Errorf("empty input data")
}
hash := sha256.Sum256(data)
return fmt.Sprintf("%x", hash), nil
}