Криптография в Go (Golang): шифрование и хеширование
Go (Golang) — современный компилируемый язык, который славится своей производительностью и встроенной поддержкой криптографических алгоритмов. Стандартная библиотека crypto предоставляет всё необходимое для защиты данных: от простого хеширования до сложного асимметричного шифрования. В этой статье мы разберём основные инструменты и покажем практические примеры кода.
Зачем нужна криптография в Go?
Криптография в Go применяется для:
- Хранения паролей (хеширование);
- Передачи данных по сети (TLS/SSL);
- Цифровых подписей и аутентификации;
- Шифрования конфиденциальных файлов.
Go гарантирует безопасность за счёт продуманного API — сложно случайно использовать устаревший или небезопасный алгоритм.
Хеширование в Go
Хеширование — это одностороннее преобразование данных в строку фиксированной длины. В Go за это отвечают пакеты crypto/md5, crypto/sha1, crypto/sha256 и crypto/sha512.
Пример: хеш SHA-256
package main
import (
"crypto/sha256"
"fmt"
)
func main() {
data := []byte("Секретные данные")
hash := sha256.Sum256(data)
fmt.Printf("SHA256: %x\n", hash)
}
Вывод: SHA256: 3c3b... (64 символа)
Хеширование с солью для паролей
Для безопасного хранения паролей используйте crypto/rand для генерации соли и crypto/sha256:
package main
import (
"crypto/rand"
"crypto/sha256"
"fmt"
)
func main() {
password := []byte("МойПароль123")
salt := make([]byte, 16)
rand.Read(salt)
salted := append(salt, password...)
hash := sha256.Sum256(salted)
fmt.Printf("Соль: %x\n", salt)
fmt.Printf("Хеш: %x\n", hash)
}
На практике для паролей лучше использовать bcrypt (пакет golang.org/x/crypto/bcrypt), но SHA-256 с солью — хороший вариант для обучения.
Симметричное шифрование: AES
AES (Advanced Encryption Standard) — самый популярный симметричный алгоритм. В Go реализован в пакете crypto/aes в связке с режимами шифрования (crypto/cipher).
Пример: шифрование AES-GCM
package main
import (
"crypto/aes"
"crypto/cipher"
"crypto/rand"
"fmt"
)
func main() {
key := []byte("0123456789abcdef0123456789abcdef") // 32 байта для AES-256
plaintext := []byte("Конфиденциальное сообщение")
block, _ := aes.NewCipher(key)
aead, _ := cipher.NewGCM(block)
nonce := make([]byte, aead.NonceSize())
rand.Read(nonce)
ciphertext := aead.Seal(nil, nonce, plaintext, nil)
fmt.Printf("Зашифровано: %x\n", ciphertext)
// Расшифровка
decrypted, _ := aead.Open(nil, nonce, ciphertext, nil)
fmt.Printf("Расшифровано: %s\n", decrypted)
}
GCM (Galois/Counter Mode) обеспечивает конфиденциальность и аутентификацию — лучший выбор для большинства задач.
Асимметричное шифрование: RSA
RSA использует пару ключей (открытый и закрытый). В Go реализован в crypto/rsa и crypto/rand.
Генерация ключей и шифрование
package main
import (
"crypto/rand"
"crypto/rsa"
"crypto/sha256"
"fmt"
)
func main() {
privateKey, _ := rsa.GenerateKey(rand.Reader, 2048)
publicKey := &privateKey.PublicKey
message := []byte("Секрет для RSA")
label := []byte("")
// Шифрование открытым ключом
ciphertext, _ := rsa.EncryptOAEP(sha256.New(), rand.Reader, publicKey, message, label)
fmt.Printf("Зашифровано RSA: %x\n", ciphertext)
// Расшифровка закрытым ключом
plaintext, _ := rsa.DecryptOAEP(sha256.New(), rand.Reader, privateKey, ciphertext, label)
fmt.Printf("