Работата с потребителските пароли е важен аспект от сигурността на уеб приложенията. В тази публикация ще проучим как сигурно да хешираме и проверяваме пароли в Golang с помощта на пакета bcrypt
, който осигурява силно и сигурно внедряване за хеширане на пароли.
Защо да използвате bcrypt пакет
“golang.org/x/crypto/bcrypt” е Go пакет, който предоставя сигурен начин за хеширане и сравняване на пароли. Базиран е на алгоритъма bcrypt, който е широко използвана функция за хеширане на пароли, която е проектирана да бъде бавна и интензивна в изчислително отношение, което я прави по-устойчива на груби атаки.
Ето някои причини, поради които е разумно да използвате „golang.org/x/crypto/bcrypt“ за хеширане на пароли:
- Сигурност: Bcrypt е добре познат и доверен алгоритъм за хеширане на пароли и се използва широко от специалисти по сигурността. Той е проектиран да бъде сигурен и устойчив на различни видове атаки като груба сила и речникови атаки.
- Осоляване: Bcrypt автоматично генерира и използва солна стойност за всеки хеш на парола, което прави много по-трудно за атакуващия да изчисли предварително списък с хешове за общи пароли. Стойността на солта също се съхранява заедно с хеша, така че няма нужда да се съхранява отделно.
- Бавна функция за хеширане: Bcrypt умишлено е бавен, което прави много по-трудно за атакуващия да извърши атака с груба сила. Това е така, защото всяко хеш изчисление отнема значително време, което прави непрактично извършването на голям брой опити за кратко време.
- Лесен за използване: „golang.org/x/crypto/bcrypt“ е прост и лесен за използване пакет, който предоставя ясен API за хеширане и сравнение на пароли.
- Поддръжка на различни платформи: 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 улеснява безопасното хеширане и проверка на пароли. Пакетът автоматично генерира уникална сол за всеки хеш, така че не е нужно да се притеснявате за генерирането или съхраняването на солта отделно. Чрез включване на хеширане на надеждна парола във вашето приложение можете значително да подобрите сигурността на потребителските данни и да помогнете за защита срещу неоторизиран достъп.
Ако обичате да четете средни статии и се интересувате да станете член, ще се радвам да споделя връзката си за препоръка с вас!