Работата с потребителските пароли е важен аспект от сигурността на уеб приложенията. В тази публикация ще проучим как сигурно да хешираме и проверяваме пароли в Golang с помощта на пакета bcrypt, който осигурява силно и сигурно внедряване за хеширане на пароли.

Защо да използвате bcrypt пакет

“golang.org/x/crypto/bcrypt” е Go пакет, който предоставя сигурен начин за хеширане и сравняване на пароли. Базиран е на алгоритъма bcrypt, който е широко използвана функция за хеширане на пароли, която е проектирана да бъде бавна и интензивна в изчислително отношение, което я прави по-устойчива на груби атаки.

Ето някои причини, поради които е разумно да използвате „golang.org/x/crypto/bcrypt“ за хеширане на пароли:

  1. Сигурност: Bcrypt е добре познат и доверен алгоритъм за хеширане на пароли и се използва широко от специалисти по сигурността. Той е проектиран да бъде сигурен и устойчив на различни видове атаки като груба сила и речникови атаки.
  2. Осоляване: Bcrypt автоматично генерира и използва солна стойност за всеки хеш на парола, което прави много по-трудно за атакуващия да изчисли предварително списък с хешове за общи пароли. Стойността на солта също се съхранява заедно с хеша, така че няма нужда да се съхранява отделно.
  3. Бавна функция за хеширане: Bcrypt умишлено е бавен, което прави много по-трудно за атакуващия да извърши атака с груба сила. Това е така, защото всяко хеш изчисление отнема значително време, което прави непрактично извършването на голям брой опити за кратко време.
  4. Лесен за използване: „golang.org/x/crypto/bcrypt“ е прост и лесен за използване пакет, който предоставя ясен API за хеширане и сравнение на пароли.
  5. Поддръжка на различни платформи: Bcrypt се поддържа в множество платформи, така че можете да го използвате за сигурно хеширане на пароли в голямо разнообразие от приложения и среди.

Като цяло използването на „golang.org/x/crypto/bcrypt“ за хеширане и сравняване на пароли е мъдър избор, тъй като предоставя сигурно, добре тествано и лесно за използване решение, което е устойчиво на различни видове атаки.

Примерен код

По-долу е даден пример за проста програма Golang, която демонстрира как да хеширате парола и да я запазите във файл, а по-късно да проверите предоставената парола срещу запазения хеш.

package main

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

const (
 passwordFile = "hashed_password.txt"
)

// saveHashedPassword saves a hashed password to a file
func saveHashedPassword(password []byte) error {
 hashedPassword, err := bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost)
 if err != nil {
  return err
 }

 err = os.WriteFile(passwordFile, hashedPassword, 0644)
 if err != nil {
  return err
 }
 return nil
}

// checkPassword checks a password against a hashed password in a file
func checkPassword(password []byte) (bool, error) {
 hashedPassword, err := os.ReadFile(passwordFile)
 if err != nil {
  return false, err
 }

 err = bcrypt.CompareHashAndPassword(hashedPassword, password)
 if err != nil {
  return false, err
 }
 return true, nil
}

func main() {
 reader := bufio.NewReader(os.Stdin)
 fmt.Print("Enter a password to save: ")
 password, _ := reader.ReadString('\n')
 password = strings.TrimSpace(password)

 err := saveHashedPassword([]byte(password))
 if err != nil {
  fmt.Println("Error saving hashed password:", err)
  return
 }
 fmt.Println("Password saved successfully.")

 fmt.Print("Enter the password to check: ")
 providedPassword, _ := reader.ReadString('\n')
 providedPassword = strings.TrimSpace(providedPassword)

 isValid, err := checkPassword([]byte(providedPassword))
 if err != nil {
  fmt.Println("Error checking password:", err)
  return
 }

 if isValid {
  fmt.Println("Access granted.")
 } else {
  fmt.Println("Access denied. Invalid password.")
 }
}

Обяснение

Кодът по-горе демонстрира просто приложение на Golang, което използва пакета bcrypt за хеширане и проверка на пароли. Първо подканва потребителя да въведе парола, която след това се хешира с помощта на bcrypt.GenerateFromPassword() и се записва във файл. След това потребителят е помолен да предостави парола за проверка и приложението проверява предоставената парола спрямо съхранения хеш, използвайки bcrypt.CompareHashAndPassword().

Заключение

Използването на пакета bcrypt в Golang улеснява безопасното хеширане и проверка на пароли. Пакетът автоматично генерира уникална сол за всеки хеш, така че не е нужно да се притеснявате за генерирането или съхраняването на солта отделно. Чрез включване на хеширане на надеждна парола във вашето приложение можете значително да подобрите сигурността на потребителските данни и да помогнете за защита срещу неоторизиран достъп.

Ако обичате да четете средни статии и се интересувате да станете член, ще се радвам да споделя връзката си за препоръка с вас!

https://medium.com/@adamszpilewicz/membership