Криптография в Go (Golang): шифрование и хеширование

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

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

Начать курс

Криптография в Go (Golang): полное руководство по шифрованию и хешированию

Go (Golang) предоставляет мощную стандартную библиотеку crypto, которая включает в себя все необходимые инструменты для реализации криптографической защиты данных. В этой статье мы подробно разберем основные возможности работы с шифрованием и хешированием в Go, включая симметричное (AES), асимметричное (RSA) шифрование, хеш-функции (SHA-256) и защиту паролей с помощью bcrypt.

1. Хеширование данных в Go

Хеширование — это одностороннее преобразование данных фиксированной длины. В Go для этого используется пакет crypto/sha256 (и другие семейства SHA).

Пример: SHA-256 хеш строки

package main

import (
    "crypto/sha256"
    "fmt"
)

func main() {
    data := "PythonLib.ru — образовательный сайт"
    hash := sha256.Sum256([]byte(data))
    fmt.Printf("SHA-256: %x\n", hash)
}

Вывод: SHA-256: 3c4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4

Для потокового хеширования (больших файлов) используйте hash.Hash интерфейс:

package main

import (
    "crypto/sha256"
    "fmt"
    "io"
    "strings"
)

func main() {
    h := sha256.New()
    reader := strings.NewReader("Поток данных для хеширования")
    io.Copy(h, reader)
    fmt.Printf("Потоковый SHA-256: %x\n", h.Sum(nil))
}

2. Защита паролей с помощью bcrypt

Для хранения паролей никогда не используйте обычные хеши (SHA-256). Используйте bcrypt — алгоритм с солью и адаптивной сложностью. В Go это реализует пакет golang.org/x/crypto/bcrypt.

Установка:

go get golang.org/x/crypto/bcrypt

Пример хеширования и проверки пароля:

package main

import (
    "fmt"
    "golang.org/x/crypto/bcrypt"
)

func main() {
    password := "MySecurePass123!"

    // Хеширование (стоимость по умолчанию = 10)
    hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
    if err != nil {
        panic(err)
    }
    fmt.Printf("bcrypt hash: %s\n", hash)

    // Проверка пароля
    err = bcrypt.CompareHashAndPassword(hash, []byte(password))
    if err != nil {
        fmt.Println("Неверный пароль")
    } else {
        fmt.Println("Пароль верный!")
    }
}

3. Симметричное шифрование AES-GCM

AES (Advanced Encryption Standard) — симметричный алгоритм. Рекомендуемый режим — GCM (Galois/Counter Mode), который обеспечивает аутентификацию (AEAD). Используйте пакет crypto/aes и crypto/cipher.

Пример шифрования и дешифрования AES-256-GCM:

package main

import (
    "crypto/aes"
    "crypto/cipher"
    "crypto/rand"
    "encoding/hex"
    "fmt"
    "io"
)

func main() {
    key := []byte("32-байтный ключ для AES-256!!!") // 32 байта
    plaintext := []byte("Секретное сообщение для PythonLib")

    // Шифрование
    ciphertext, nonce := encryptAESGCM(key, plaintext)
    fmt.Printf("Зашифровано: %s\n", hex.EncodeToString(ciphertext))

    // Дешифрование
    decrypted, err := decryptAESGCM(key, ciphertext, nonce)
    if err != nil {
        panic(err)
    }
    fmt.Printf("Расшифровано: %s\n", decrypted)
}

func encryptAESGCM(key, plaintext []byte) (ciphertext, nonce []byte) {
    block, _ := aes.NewCipher(key)
    gcm, _ := cipher.NewGCM(block)
    nonce = make([]byte, gcm.NonceSize())
    io.ReadFull(rand.Reader, nonce)
    return gcm.Seal(nil, nonce, plaintext, nil), nonce
}

func decryptAESGCM(key, ciphertext, nonce []byte) ([]byte, error) {
    block, _ := aes.NewCipher(key)
    gcm, _ := cipher.NewGCM(block)
    return gcm.Open(nil, nonce, ciphertext, nil)
}

4. Асимметричное шифрование RSA

RSA использует пару ключей (открытый/закрытый). В Go реализован в пакетах

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