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

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

實(shí)際開發(fā)中如何存儲(chǔ)密碼(md5加鹽bcrypt)golang

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

文章目錄

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

簡介

一般前端把用戶密碼發(fā)給服務(wù)端,服務(wù)端實(shí)際業(yè)務(wù)中如何存儲(chǔ)密碼呢,如何存儲(chǔ)密碼才能保證密碼不被開發(fā)者獲取或者被截取呢,保證密碼的安全

加鹽的加密方式

現(xiàn)在的企業(yè)開發(fā)大都采用這種方式了,比較安全的密碼存儲(chǔ)算法要求鹽值至少在 8 Bytes 以上

首先肯定不可能明文傳輸,必須對(duì)密碼加密,那怎么加密呢,我往下細(xì)看。一般加密比如 md5 直接為什么不行,因?yàn)槠平庹呖赡芡ㄟ^暴力破解的方式,字典破解的方式還是能找到原始密碼是啥

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

md5 加鹽方式

注冊(cè)時(shí)候:

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

登錄:

  • 用戶密碼到服務(wù)端
  • 服務(wù)端獲取 salt,對(duì)密碼進(jìn)行加鹽加密和數(shù)據(jù)庫比對(duì)
  • 比對(duì)正確登錄 ok,比對(duì)錯(cuò)誤則失敗

bcrypt 方式

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

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

// EncryptPassword 將密碼加密,需要傳入密碼返回的是加密后的密碼
func EncryptPassword(password string) (string, error) {
	// 加密密碼,使用 bcrypt 包當(dāng)中的 GenerateFromPassword 方法,bcrypt.DefaultCost 代表使用默認(rèn)加密成本
	encryptPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
	if err != nil {
		// 如果有錯(cuò)誤則返回異常,加密后的空字符串返回為空字符串,因?yàn)榧用苁?/span>
		return "", err
	} else {
		// 返回加密后的密碼和空異常
		return string(encryptPassword), nil
	}
}

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

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

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