? ? ? ? 不管你給你的程序進(jìn)行了多少加密,黑客都可能有一萬種辦法黑進(jìn)你的數(shù)據(jù)庫(kù)。一個(gè)成熟的軟件必須要有額外的加密系統(tǒng)。這樣,即使數(shù)據(jù)庫(kù)真的被攻破,我們也可以更好地保護(hù)我們的用戶信息。這就是Bcrypt的作用,加鹽salt和散列hash
注意:本文僅僅講解Bcrypt的作用及用法,因此會(huì)盡量少的設(shè)計(jì)額外的概念。在真正寫碼時(shí)所需要的數(shù)據(jù)庫(kù)的操作以及路由的操作會(huì)盡量忽略
目錄
為什么要給密碼加密
在NodeJs中使用Bcrypt加密
在用戶登錄的時(shí)候使用Bcrypt校驗(yàn)身份
為什么要給密碼加密?
? ? ? ? 散列(hash)的意思是給一段普通文字使用算法加密,使他變成一個(gè)固定長(zhǎng)度的字符串。不管這段文字有多長(zhǎng),經(jīng)過算法處理后的最終的結(jié)果都將是相同長(zhǎng)度。并且每次的結(jié)果都將完全相同。
? ? ? ? 舉個(gè)例子,不過你是把111還是把'alongword'或者是其他的一些文本傳進(jìn)去,結(jié)果都會(huì)是一樣的長(zhǎng)度。并且相同的字符會(huì)一定會(huì)產(chǎn)出相同的結(jié)果。這顯然不是一個(gè)安全的做法。所以僅僅散列是不夠的。
給密碼加鹽
? ? ? ? 鹽 (salt)是一個(gè)隨機(jī)的字符串。如果你在hash的時(shí)候加入鹽作為干擾的話,那么結(jié)果就不會(huì)再保持相同了。鹽會(huì)被自動(dòng)加到hash里面,所以你不需要刻意把他保存到數(shù)據(jù)庫(kù)里面。
? ? ? ? Bcrypt早在1996年就存在,并且經(jīng)過多年的大量網(wǎng)站的使用和驗(yàn)證,鮮有報(bào)道出來的問題。可以說他的這一套算法是很安全的。接下來,我們將使用node的中間件來讓Bcrypt為我們的用戶密碼加鹽并散列。
在NodeJs中使用Bcrypt加密
? ? ? ? 首先,如果你不是很熟悉node,我們要先初始化一個(gè)node程序:
mkdir jwt-project 創(chuàng)建文件夾
cd jwt-project 進(jìn)入文件夾
npm init -y 初始化node程序
? ? ? ? 接下來,我們需要安裝一些依賴:
npm install bcrypt
? ? ? ? 安裝完所需要的依賴后,我們就可以在node模塊中引入并使用Bcrypt了
const bcrypt = require('bcrypt');
? ? ? ? 接下來,我們需要一個(gè)變量:saltRounds。saltRounds?代表加密所需的時(shí)間,saltRounds越大,加密所需時(shí)間越長(zhǎng),加密后的密碼也就越安全。但是我們也不想讓用戶永遠(yuǎn)等著我們加密密碼,所以一般使用默認(rèn)值10就可以。
const saltRounds = 10;
? ? ? ? 為了方便,我們就不使用真實(shí)用戶的密碼了。我們自己寫一個(gè)固定值就好
var password = "iamapassword";
? ? ? ? 接下來,我們要利用Bcrypt的genSalt和hash方式來生成并且存儲(chǔ)我們最終生成的hash。首先,我們先使用bcrypt.genSalt會(huì)接收saltRounds和回調(diào)函數(shù),這個(gè)回調(diào)函數(shù)會(huì)返回salt結(jié)果和error對(duì)象:
bcrypt.genSalt(saltRounds, function(err, salt) {
// 返回salt值或者進(jìn)行錯(cuò)誤處理
});
? ? ? ? ?在得到salt值后,我們?cè)诨卣{(diào)的內(nèi)部再調(diào)用Bcrypt的hash方式來生成hash。hash接受三個(gè)參數(shù),分別是密碼,salt,和回調(diào)函數(shù)。通常,我們會(huì)在這個(gè)回調(diào)函數(shù)里將處理好的hash存儲(chǔ)到數(shù)據(jù)庫(kù)中,或者進(jìn)行錯(cuò)誤處理。
bcrypt.genSalt(saltRounds, function(err, salt) {
bcrypt.hash(password, salt, function(err, hash) {
// 返回hash的值,并將他存儲(chǔ)到數(shù)據(jù)庫(kù)中
});
});
但其實(shí),你也可以把以上兩個(gè)函數(shù)合并成一個(gè),結(jié)果如下
bcrypt.hash(password, saltRounds, function(err, hash) {
// 數(shù)據(jù)庫(kù)操作和錯(cuò)誤處理
});
在用戶登錄的時(shí)候使用Bcrypt校驗(yàn)身份
? ? ? ? 如果你知道如何查看數(shù)據(jù)庫(kù)的話,你會(huì)發(fā)現(xiàn)這時(shí)候新注冊(cè)的用戶密碼已經(jīng)變成了一段長(zhǎng)長(zhǎng)的hash。這時(shí)候,再當(dāng)用戶登錄的時(shí)候,我們就不能簡(jiǎn)單的對(duì)比用戶輸入的密碼和數(shù)據(jù)庫(kù)的hash了。Bcrypt為我們提供了一個(gè)方法,叫做compare。bcrypt.compare()會(huì)接受三個(gè)參數(shù),分別是用戶輸入的密碼,數(shù)據(jù)庫(kù)中的hash,和回調(diào)函數(shù),回調(diào)函數(shù)會(huì)返回一個(gè)布爾值,如果密碼和hash吻合的話,就返回true,反之false。
? ? ? ? ?仍然為了方便起見,我們手寫一個(gè)字符串充當(dāng)密碼,來讓bcrypt幫我們驗(yàn)證密碼是否正確文章來源:http://www.zghlxwxcb.cn/news/detail-492508.html
var password2 = "iamapassword";
bcrypt.compare(password2, hash, function(err, result) {
if (result) {
console.log("密碼正確")
}
else {
console.log("密碼錯(cuò)誤");
}
});
總結(jié):
? ? ? ? Bcrypt的存在為我們的程序多加了一層保障,它利用加鹽和散列的算法將我們的密碼加密成一段很難破解的長(zhǎng)字符串,這樣,即使我們的數(shù)據(jù)庫(kù)被攻破,hash后的密碼也可以給我們提供最后一層保護(hù)文章來源地址http://www.zghlxwxcb.cn/news/detail-492508.html
到了這里,關(guān)于如何在NodeJs中使用Bcrypt來保護(hù)用戶密碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!