Надежное сокрытие паролей в Golang: лучшие методы и примеры

Безопасность паролей имеет решающее значение в любом приложении, которое занимается аутентификацией пользователей. В этой статье блога мы рассмотрим различные методы Golang для безопасного сокрытия паролей. Мы рассмотрим такие методы, как шифрование, хеширование и добавление соли, а также приведем примеры кода, демонстрирующие их реализацию.

Метод 1: шифрование
Шифрование — это процесс преобразования данных в виде открытого текста в форму, нечитаемую без соответствующего ключа дешифрования. Вот пример того, как шифровать и расшифровывать пароли в Golang с использованием алгоритма шифрования AES:

import (
    "crypto/aes"
    "crypto/cipher"
    "crypto/rand"
    "io"
    "log"
)
func encrypt(key []byte, plaintext []byte) ([]byte, error) {
    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, err
    }
    ciphertext := make([]byte, aes.BlockSize+len(plaintext))
    iv := ciphertext[:aes.BlockSize]
    if _, err := io.ReadFull(rand.Reader, iv); err != nil {
        return nil, err
    }
    stream := cipher.NewCFBEncrypter(block, iv)
    stream.XORKeyStream(ciphertext[aes.BlockSize:], plaintext)
    return ciphertext, nil
}
func decrypt(key []byte, ciphertext []byte) ([]byte, error) {
    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, err
    }
    iv := ciphertext[:aes.BlockSize]
    ciphertext = ciphertext[aes.BlockSize:]
    stream := cipher.NewCFBDecrypter(block, iv)
    stream.XORKeyStream(ciphertext, ciphertext)
    return ciphertext, nil
}

Метод 2: хеширование
Хеширование — это односторонний процесс, который преобразует входные данные в строку символов фиксированного размера. Обычно используется для хранения паролей. Вот пример того, как хэшировать пароли с помощью пакета bcrypt в Golang:

import (
    "golang.org/x/crypto/bcrypt"
    "log"
)
func hashPassword(password string) (string, error) {
    hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
    if err != nil {
        return "", err
    }
    return string(hashedPassword), nil
}
func comparePasswords(hashedPassword string, password string) error {
    return bcrypt.CompareHashAndPassword([]byte(hashedPassword), []byte(password))
}

Метод 3: Соление
Соль добавляет к паролю дополнительное случайное значение перед хешированием, что усложняет злоумышленникам взлом паролей с использованием заранее вычисленных таблиц. Вот пример того, как солить пароли с помощью пакета bcrypt в Golang:

import (
    "golang.org/x/crypto/bcrypt"
    "log"
)
func hashAndSaltPassword(password string) (string, error) {
    salt, err := bcrypt.GenerateSalt(bcrypt.DefaultCost)
    if err != nil {
        return "", err
    }
    hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
    if err != nil {
        return "", err
    }
    return string(hashedPassword), nil
}
func comparePasswords(hashedPassword string, password string) error {
    return bcrypt.CompareHashAndPassword([]byte(hashedPassword), []byte(password))
}

В этой статье блога мы рассмотрели в Golang несколько методов безопасного сокрытия паролей. Мы рассмотрели методы шифрования, хеширования и добавления, а также примеры кода, демонстрирующие их реализацию. Важно выбрать правильный метод, исходя из ваших конкретных требований и потребностей в безопасности. Используя эти методы, вы можете значительно повысить безопасность хранилища паролей вашего приложения.