Hash Algorithms in Go
Standard Library Hash Packages
Go provides multiple hash algorithms through standard library packages:
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]
Implementing Common Hash Algorithms
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 (Not Recommended for Security)
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)
}
Hash Algorithm Comparison
Algorithm |
Output Length |
Security Level |
Performance |
MD5 |
128 bits |
Low |
Fast |
SHA-1 |
160 bits |
Low |
Moderate |
SHA-256 |
256 bits |
High |
Moderate |
SHA-512 |
512 bits |
Very High |
Slower |
Advanced Hashing Techniques
Salted Hashes
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
- Use SHA-256 or SHA-3 for most applications
- Always use salting for password storage
- Avoid MD5 and SHA-1 for security-critical tasks
- Consider using bcrypt for password hashing
graph LR
A[Input Data] --> B{Hash Algorithm}
B --> |MD5| C[Fastest]
B --> |SHA-256| D[Balanced]
B --> |SHA-512| E[Most Secure, Slowest]
Error Handling in 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
}