用雜湊存儲密碼
目錄
軟體開發實務 - 系列文
6: ➫
06: 本節課講解使用 bcrypt 儲存和驗證密碼,實現安全的會員創建API。
安全儲存會員密碼#
在現代的後端開發中,保護會員的密碼安全是一個重要課題。這通常通過對密碼進行雜湊處理來實現,而不是將明文密碼直接存儲在資料庫中。bcrypt 雜湊函式是一個常用的選擇,因為它可以有效防止彩虹表攻擊。
密碼雜湊過程#
- 雜湊函式選擇: bcrypt 雜湊函式被廣泛使用,因其安全性高且可靠。
- 成本參數: bcrypt 要求指定一個成本參數,決定算法的迭代次數。
- 隨機鹽值: 為了增強安全性,bcrypt 在雜湊過程中會生成一個隨機鹽值。
- 雜湊值生成: 最終生成的雜湊值套件含算法標識符、成本、鹽值和雜湊值本身。
實現密碼雜湊與驗證#
用 bcrypt 雜湊函式實現密碼雜湊與驗證:
雜湊密碼#
- HashPassword 函式: 接收明文密碼,返回 bcrypt 雜湊值。
- bcrypt.GenerateFromPassword: 用於生成密碼的 bcrypt 雜湊。
- 錯誤處理: 確保在雜湊過程中處理任何可能的錯誤。
func HashPassword(password string) (string, error) {
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
if err != nil {
return "", fmt.Errorf("failed to hash password: %w", err)
}
return string(hashedPassword), nil
}
驗證密碼#
- CheckPassword 函式: 驗證提交的密碼是否與資料庫中的雜湊值匹配。
- bcrypt.CompareHashAndPassword: 用於比較明文密碼與雜湊值。
func CheckPassword(password, hashedPassword string) error {
return bcrypt.CompareHashAndPassword([]byte(hashedPassword), []byte(password))
}
實現會員建立 API#
在開發過程中,將上述雜湊與驗證邏輯整合進會員建立 API 是必要的。
建立會員#
- 接收會員資料: 套件括會員名、密碼、全名和電子郵件。
- 雜湊處理密碼: 在儲存到資料庫前,將會員密碼進行 bcrypt 雜湊處理。
- 錯誤處理: 處理可能的錯誤,如會員名重複或資料庫連接問題。
func (server *Server) createMember(ctx *gin.Context) {
var req createMemberRequest
if err := ctx.ShouldBindJSON(&req); err != nil {
ctx.JSON(http.StatusBadRequest, errorResponse(err))
return
}
hashedPassword, err := util.HashPassword(req.Password)
if err != nil {
ctx.JSON(http.StatusInternalServerError, errorResponse(err))
return
}
arg := db.CreateMemberParams{
Membername: req.Membername,
PasswordHash: hashedPassword,
NameEntire: req.NameEntire,
Email: req.Email,
}
// ...剩餘的建立會員邏輯...
}
小結#
本節課程深入探討了如何在 Go 中使用 bcrypt 來安全地雜湊和驗證會員密碼,並實現了一個安全的會員建立 API。透過這些技術,我們能夠有效保護會員資料的安全,並提高整體應用的安全性。
課程檔案記錄#
軟體開發實務 - 系列文
6: ➫
相關文章
實現JWT用戶認證
07: 本節課介紹在 Go 利用 JWT 技術實現安全的用戶登入和驗證系統。
實作middleware
08: 本節課程講解如何實作身份驗證與中介軟體授權邏輯,並通過單元測試確保其正確性。
非同步任務實踐:整合Redis與asynq
10: 本節課解說如何實現非同步任務處理,並利用 Redis 實作任務隊列。