日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

實際開發中如何存儲密碼(md5加鹽bcrypt)golang

作者:abcnull 更新時間: 2023-07-05 編程語言

文章目錄

  • 簡介
  • 加鹽的加密方式
    • md5 加鹽方式
    • bcrypt 方式

簡介

一般前端把用戶密碼發給服務端,服務端實際業務中如何存儲密碼呢,如何存儲密碼才能保證密碼不被開發者獲取或者被截取呢,保證密碼的安全

加鹽的加密方式

現在的企業開發大都采用這種方式了,比較安全的密碼存儲算法要求鹽值至少在 8 Bytes 以上

首先肯定不可能明文傳輸,必須對密碼加密,那怎么加密呢,我往下細看。一般加密比如 md5 直接為什么不行,因為破解者可能通過暴力破解的方式,字典破解的方式還是能找到原始密碼是啥

因此我需要一種加鹽的加密方式:比如 md5 加鹽加密,即鹽是一個隨機生成的字符串,然后我們將 salt 和原始密碼連接起來,將其加密,這樣就不容易被破解了。即先加鹽再加密

md5 加鹽方式

注冊時候:

  • 用戶密碼和其他信息到服務端
  • 服務端識別密碼,隨機函數生成鹽和密碼做拼接
  • 拼接后進行 md5 加密
  • 將 salt 和 hash 值存放數據庫

登錄:

  • 用戶密碼到服務端
  • 服務端獲取 salt,對密碼進行加鹽加密和數據庫比對
  • 比對正確登錄 ok,比對錯誤則失敗

bcrypt 方式

特點:相比于 md5,bcrypt 每次相同密碼生成的密文都不同,md5 則相同,bcrypt 加密計算比 md5 更久,因此破解更難
在這里插入圖片描述

import "golang.org/x/crypto/bcrypt"

// EncryptPassword 將密碼加密,需要傳入密碼返回的是加密后的密碼
func EncryptPassword(password string) (string, error) {
	// 加密密碼,使用 bcrypt 包當中的 GenerateFromPassword 方法,bcrypt.DefaultCost 代表使用默認加密成本
	encryptPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
	if err != nil {
		// 如果有錯誤則返回異常,加密后的空字符串返回為空字符串,因為加密失敗
		return "", err
	} else {
		// 返回加密后的密碼和空異常
		return string(encryptPassword), nil
	}
}

// EqualsPassword 對比密碼是否正確
func EqualsPassword(password, encryptPassword string) bool {
	// 使用 bcrypt 當中的 CompareHashAndPassword 對比密碼是否正確,第一個參數為加密后的密碼,第二個參數為未加密的密碼
	err := bcrypt.CompareHashAndPassword([]byte(encryptPassword), []byte(password))
	// 對比密碼是否正確會返回一個異常,按照官方的說法是只要異常是 nil 就證明密碼正確
	return err == nil
}

原文鏈接:https://abcnull.blog.csdn.net/article/details/129438319

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新