Криптография в Go: шифрование и хеширование для начинающих

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Криптография в 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("                    

Рекомендаций