最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang使用bcrypt包對(duì)密碼進(jìn)行加密的方法實(shí)現(xiàn)

 更新時(shí)間:2023年07月17日 09:53:52   作者:m舊褲子  
本文主要介紹了golang使用bcrypt包對(duì)密碼進(jìn)行加密的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

bcrypt

bcrypt是一個(gè)由美國計(jì)算機(jī)科學(xué)家尼爾斯·普羅沃斯(Niels Provos)以及大衛(wèi)·馬齊耶(David Mazières)根據(jù)Blowfish加密算法所設(shè)計(jì)的密碼散列函數(shù),于1999年在USENIX中展示。實(shí)現(xiàn)中bcrypt會(huì)使用一個(gè)加鹽的流程以防御彩虹表攻擊,同時(shí)bcrypt還是適應(yīng)性函數(shù),它可以借由增加迭代之次數(shù)來抵御日益增進(jìn)的電腦運(yùn)算能力透過暴力法破解。

由bcrypt加密的文件可在所有支持的操作系統(tǒng)和處理器上進(jìn)行轉(zhuǎn)移。它的口令必須是8至56個(gè)字符,并將在內(nèi)部被轉(zhuǎn)化為448位的密鑰。然而,所提供的所有字符都具有十分重要的意義。密碼越強(qiáng)大,數(shù)據(jù)就越安全。

除了對(duì)數(shù)據(jù)進(jìn)行加密,默認(rèn)情況下,bcrypt在刪除數(shù)據(jù)之前將使用隨機(jī)數(shù)據(jù)三次覆蓋原始輸入文件,以阻撓可能會(huì)獲得計(jì)算機(jī)數(shù)據(jù)的人恢復(fù)數(shù)據(jù)的嘗試。如果您不想使用此功能,可設(shè)置禁用此功能。

bcrypt哈希示意圖

下圖為bcrypt哈希的示例圖,其由四部分組成:

  • Prefix說明了使用的bcrypt的版本
  • Cost是進(jìn)行哈希的次數(shù)-數(shù)字越大生成bcrypt的速度越慢,成本越大。同樣也意味著如果密碼庫被盜,攻擊者想通過暴力破解的方法猜測出用戶密碼的成本變得越昂貴。
  • Salt是添加到要進(jìn)行哈希的字符串中的隨機(jī)字符(21.25個(gè)字符),所以使用bcrypt時(shí)不需要我們?cè)诒砝飭为?dú)存儲(chǔ)Salt。
  • Hashed Text是明文字符串最終被bcrypt應(yīng)用這些設(shè)置哈希后的哈希文本。
  • 另外無論什么方法:每個(gè)密碼加單獨(dú)的鹽進(jìn)行哈希,使用bcrypt進(jìn)行哈希等等,如果用戶使用非常簡單的密碼例如password或123456,還是能被猜測出來的,所以在用戶設(shè)置密碼時(shí)應(yīng)該禁止他們輸入簡單的密碼。

go語言中使用bcrypt對(duì)密碼進(jìn)行加密

go語言庫中,bcrypt只能做單向加密,而不能反向破解生成明文,但是可以對(duì)原密碼和進(jìn)行hash加密后的hash值進(jìn)行比對(duì)判斷是否相同,使用bcrypt進(jìn)行加密,同一個(gè)密碼每次生成的hash值都是不相同的。每次加密的時(shí)候首先會(huì)生成一個(gè)隨機(jī)數(shù)就是鹽,之后將這個(gè)隨機(jī)數(shù)與密碼進(jìn)行hash。

// 加密密碼
func HashAndSalt(pwd string) string {
	hash, err := bcrypt.GenerateFromPassword([]byte(pwd), bcrypt.MinCost)
	if err != nil {
		log.Println(err)
	}
	return string(hash)
}
// 驗(yàn)證密碼
func ComparePasswords(hashedPwd string, plainPwd string) bool {
	byteHash := []byte(hashedPwd)
	err := bcrypt.CompareHashAndPassword(byteHash, []byte(plainPwd))
	if err != nil {
		log.Println(err)
		return false
	}
	return true
}

這里簡單對(duì)兩個(gè)方法封裝了一下,方便后期調(diào)用。

在go語言中,bcrypt.GenerateFromPassword() 是對(duì)字符串進(jìn)行加密hash的函數(shù),其中第一個(gè)參數(shù)[]byte(pwd)是對(duì)原字符串轉(zhuǎn)換為字節(jié)切片,第二個(gè)參數(shù)bcrypt.MinCost為對(duì)字符串進(jìn)行哈希的次數(shù),也就是上圖中的Cost。bcrypt.CompareHashAndPassword()是對(duì)hash過的字符串和原字符串進(jìn)行判斷,其中第一個(gè)參數(shù)byteHash是hash加密過的hash值,第二個(gè)參數(shù)[]byte(plainPwd)是原字符串,bcrypt.CompareHashAndPassword()進(jìn)行判斷兩個(gè)參數(shù)是否一個(gè)值。

示例:

func main() {
	pwd1 := "wlc1003.."
	pwd2 := "wlc1003.."
	pwd3 := "wlc1003"
	hash1 := utils.HashAndSalt(pwd1)
	hash2 := utils.HashAndSalt(pwd2)
	hash3 := utils.HashAndSalt(pwd3)
	fmt.Println(hash1)
	fmt.Println(hash2)
	fmt.Println(hash3)
	fmt.Println(utils.ComparePasswords(hash2, pwd1))
	fmt.Println(utils.ComparePasswords(hash3, pwd2))
	fmt.Println(utils.ComparePasswords(hash1, pwd2))
}

//輸出
$2a$04$4MXIN0OQeiKf7HI.eKYw6eRM1mcjDrItX0wzgOSVgkczsvFj8ifuW
$2a$04$aJz4S67m.CTTP3gBiKoVZu3CTMujCImTqcUaPppcKzoUXtsIR.Z5.
$2a$04$OVXCGxnkIpvFSegtq20hHOhtvMwFIRp.iBog4E62CS9uaQ/PlDH5S

true
2023/07/16 21:53:24 crypto/bcrypt: hashedPassword is not the hash of the given password //表示不匹配
false
true

 到此這篇關(guān)于golang使用bcrypt包對(duì)密碼進(jìn)行加密的方法實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)golang bcrypt密碼加密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語言實(shí)現(xiàn)常見限流算法的示例代碼

    Go語言實(shí)現(xiàn)常見限流算法的示例代碼

    計(jì)數(shù)器、滑動(dòng)窗口、漏斗算法、令牌桶算法是我們常見的幾個(gè)限流算法,本文將依次用Go語言實(shí)現(xiàn)這幾個(gè)限流算法,感興趣的可以了解一下
    2023-05-05
  • 手把手教你vscode配置golang開發(fā)環(huán)境的步驟

    手把手教你vscode配置golang開發(fā)環(huán)境的步驟

    這篇文章主要介紹了手把手教你vscode配置golang開發(fā)環(huán)境的步驟,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • 試了下Golang實(shí)現(xiàn)try catch的方法

    試了下Golang實(shí)現(xiàn)try catch的方法

    雖然在使用Golang的時(shí)候發(fā)現(xiàn)沒有try catch這種錯(cuò)誤處理機(jī)制但是想一想golang作為一門優(yōu)雅的語言,似乎也是情理之中。那么夠怎么捕獲異常呢,本文就來介紹一下
    2021-07-07
  • 詳解Go語言如何實(shí)現(xiàn)并發(fā)安全的map

    詳解Go語言如何實(shí)現(xiàn)并發(fā)安全的map

    go語言提供的數(shù)據(jù)類型中,只有channel是并發(fā)安全的,基礎(chǔ)map并不是并發(fā)安全的,本文為大家整理了三種實(shí)現(xiàn)了并發(fā)安全的map的方案,有需要的可以參考下
    2023-12-12
  • Golang中的archive/zip包的常用函數(shù)詳解

    Golang中的archive/zip包的常用函數(shù)詳解

    Golang 中的 archive/zip 包用于處理 ZIP 格式的壓縮文件,提供了一系列用于創(chuàng)建、讀取和解壓縮 ZIP 格式文件的函數(shù)和類型,下面小編就來和大家講解下常用函數(shù)吧
    2023-08-08
  • golang?RPC包原理和使用詳細(xì)介紹

    golang?RPC包原理和使用詳細(xì)介紹

    golang的rpc支持三個(gè)級(jí)別的RPC:TCP、HTTP、JSONRPC。但Go的RPC包是獨(dú)一無二的RPC,它和傳統(tǒng)的RPC系統(tǒng)不同,它只支持Go開發(fā)的服務(wù)器與客戶端之間的交互,因?yàn)樵趦?nèi)部,它們采用了Gob來編碼
    2022-09-09
  • Golang中web參數(shù)校驗(yàn)的實(shí)現(xiàn)

    Golang中web參數(shù)校驗(yàn)的實(shí)現(xiàn)

    本文介紹了使用Gin框架進(jìn)行參數(shù)校驗(yàn)的幾種方法,包括JSON、URL查詢、表單數(shù)據(jù)的校驗(yàn),常用校驗(yàn)規(guī)則,自定義錯(cuò)誤信息和自定義校驗(yàn)規(guī)則,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-11-11
  • Golang中使用Mqtt的方法示例

    Golang中使用Mqtt的方法示例

    本文介紹了Golang中使用paho.mqtt.golang庫實(shí)現(xiàn)MQTT客戶端與服務(wù)器的連接、訂閱和消息收發(fā),具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-02-02
  • Golang實(shí)現(xiàn)http重定向https

    Golang實(shí)現(xiàn)http重定向https

    這篇文章介紹了Golang實(shí)現(xiàn)http重定向https的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • 淺析Golang中的協(xié)程(goroutine)

    淺析Golang中的協(xié)程(goroutine)

    在Go語言中,協(xié)程(goroutine)是輕量級(jí)的線程,它是Go語言中實(shí)現(xiàn)并發(fā)編程的基礎(chǔ),Go語言中的協(xié)程是由Go運(yùn)行時(shí)調(diào)度器(scheduler)進(jìn)行管理和調(diào)度的,本文將給大家簡單的介紹一下Golang中的協(xié)程,需要的朋友可以參考下
    2023-05-05

最新評(píng)論

崇阳县| 阳新县| 措勤县| 瓦房店市| 甘泉县| 津市市| 平罗县| 民丰县| 白山市| 平谷区| 嘉禾县| 五寨县| 南江县| 富民县| 苏尼特左旗| 景洪市| 霍邱县| 灵山县| 通海县| 南雄市| 炎陵县| 元谋县| 永宁县| 蓬溪县| 潮安县| 谷城县| 安徽省| 肥乡县| 城固县| 老河口市| 湖北省| 稻城县| 宜丰县| 曲阜市| 连江县| 万年县| 玛沁县| 射洪县| 通州区| 桦南县| 临武县|