Криптография в 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 реализован в пакетах