摘要:第三階段這種方式是在實(shí)習(xí)中學(xué)習(xí)到的,也就是對(duì)密碼來進(jìn)行加鹽。什么是加鹽在密碼學(xué)中,是指通過在密碼任意固定位置插入特定的字符串,讓散列后的結(jié)果和使用原始密碼的散列結(jié)果不相符,這種過程稱之為加鹽。
寫在前面
本文描述了本人,對(duì)于數(shù)據(jù)庫中如何保存密碼的認(rèn)識(shí)過程。從最簡(jiǎn)單的明文保存到密碼加鹽保存,下面與大家分享下:
第一階段最開始接觸web開發(fā)時(shí),對(duì)于用戶表的密碼基本是明文保存,如:
username | password ---------|---------- zp1996 |123456 zpy |123456789
這種方式可以說很不安全,一旦數(shù)據(jù)庫泄漏,那么所以得用戶信息就會(huì)被泄漏。之前,國(guó)內(nèi)普遍采用這種方式,造成了很多的事故,如csdn600萬用戶信息泄漏、12306用戶信息泄漏等。
第二階段本人大學(xué)做過的所有的項(xiàng)目基本采用的都是這種方式來保存用戶密碼,就是對(duì)密碼進(jìn)行md5加密,在php中md5即可,在node中利用crypto模塊就好:
const encrypt = (text) => { return crypto.createHash("md5").update(String(text)).digest("hex"); };
作為初學(xué)者的我,認(rèn)為這種方式是很安全的,因?yàn)?b>md5不可逆(指攻擊者不能從哈希值h(x)中逆推出x)而且碰撞幾率低(指攻擊值不能找到兩個(gè)值x、x"具有相同的哈希值);然而這種方式也是不安全的,只要枚舉出所有的常用密碼,做成一個(gè)索引表,就可以推出來原始密碼,這張索引表也被叫做“彩虹表”(之前csdn600萬用戶明文密碼就是一個(gè)很好的素材)。
第三階段這種方式是在實(shí)習(xí)中學(xué)習(xí)到的,也就是對(duì)密碼來進(jìn)行加鹽。
什么是加鹽?在密碼學(xué)中,是指通過在密碼任意固定位置插入特定的字符串,讓散列后的結(jié)果和使用原始密碼的散列結(jié)果不相符,這種過程稱之為“加鹽”。
加鹽很好理解,就是給原始密碼加上特定的字符串,這樣給攻擊者增加攻擊的成本,加鹽的關(guān)鍵在于如何選擇鹽:
固定字符串采用固定的字符串作為鹽,如下面這樣:
const encrypt = (text) => { text = text + "zp"; return crypto.createHash("md5").update(text).digest("hex"); };
這種加鹽方式與多進(jìn)行幾次md5一樣的,沒有任何意義,攻擊者都可以拿到數(shù)據(jù)庫,難道拿不到源代碼嗎,根據(jù)源代碼攻擊者很輕松的就可以構(gòu)造新的彩虹表出來逆推密碼。
隨機(jī)字符串鹽一般要求是固定長(zhǎng)度的隨機(jī)字符串,且每個(gè)用戶的鹽不同,比如10位,數(shù)據(jù)庫可以這樣存儲(chǔ):
username | password |salt ---------|---------—------------------------|---------- zp1996 |2636fd8789595482abf3423833901f6e |63UrCwJhTH zpy |659ec972c3ed72d04fac7a2147b5827b |84GljVnhDT
采用的加密方式為:
md5(md5(password) + salt)
將其轉(zhuǎn)化為node代碼:
/* * 10位鹽 * 時(shí)間戳(2)+隨機(jī)字母(8) */ const salt = () => { var time = Date.now() % 100, str = ""; time = time === 0 ? "00" : String(time); for (let i = 0; i < 8; i++) { const base = Math.random() < 0.5 ? 65 : 97; str += String.fromCharCode( base + Math.floor( Math.random() * 26 ) ); } return time + str; }; const md5 = (text) => { return crypto.createHash("md5").update(String(text)).digest("hex"); }; const encrypt = (password) => { return md5(md5(password) + salt()); };寫在最后
以隨機(jī)字符串作為鹽對(duì)密碼進(jìn)行加鹽僅僅是增加破解密碼的難度,假如目前有30w的用戶數(shù)據(jù),那么就會(huì)有30w個(gè)鹽,利用600w的索引表去比對(duì)的話,需要?jiǎng)?chuàng)造出30w*600w的數(shù)據(jù)來一一比對(duì),這樣會(huì)增加攻擊者的成本。以上內(nèi)容,如有錯(cuò)誤,歡迎大家指出。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/88113.html
摘要:沒錯(cuò),年的破解就是證明了在碰撞上面不可靠,也就是可以通過某種方式快速的找到具有相同散列值的另一個(gè)信息。好,第二個(gè)不安全的誤區(qū)來了上述破解過程對(duì)于絕大多數(shù)散列函數(shù)來說,基本上都是一個(gè)道理。 轉(zhuǎn)載請(qǐng)注明出處 http://www.paraller.com 原文排版地址 點(diǎn)擊獲取更好閱讀體驗(yàn) 轉(zhuǎn)載: http://blog.sina.com.cn/s/blog_77e8d1350100w...
摘要:通俗一點(diǎn)說就是彩虹表犧牲了一點(diǎn)計(jì)算速度,換來的好處是較少的空間存儲(chǔ)更多的密碼數(shù)據(jù)。關(guān)于鹽的使用有一點(diǎn)需要說明加鹽的目的是為了增加提前構(gòu)造字典和彩虹表的代價(jià),并不是為了加密或增加密碼的計(jì)算復(fù)雜性。 背景 密碼是用來進(jìn)行鑒權(quán)(身份認(rèn)證)一種手段,說白了就是證明你是誰。一般鑒權(quán)都可以總結(jié)為下面3種形式: 你知道什么? (如密碼,密碼提示問題等) 你有什么? (如信用卡,token卡等) 你...
摘要:加密工具模塊提供了加密功能,包括對(duì)的哈希加密解密簽名以及驗(yàn)證功能的一整套封裝。當(dāng)然也是優(yōu)缺點(diǎn)的加密相同的字符是結(jié)果都是相同的碼,會(huì)出現(xiàn)撞庫的風(fēng)險(xiǎn)。 nodejs-crypto 加密工具 crypto 模塊提供了加密功能,包括對(duì) OpenSSL 的哈希、MD5、HMAC、加密、解密、簽名、以及驗(yàn)證功能的一整套封裝。 crypto 常用的MD5 MD5 是一種不可逆的加密算法,目前是最牢靠...
摘要:的作用是讓大容量信息在用數(shù)字簽名軟件簽署私人密鑰前被壓縮成一種保密的格式就是把一個(gè)任意長(zhǎng)度的字節(jié)串變換成一定長(zhǎng)的十六進(jìn)制數(shù)字串。獲取由位隨機(jī)大小寫字母數(shù)字組成的值每次從中隨機(jī)取一位獲取原始密碼的值原始密碼隨機(jī)生成位加密后的密碼 MD5是什么 下面的概念是百度百科的: Message Digest Algorithm MD5(中文名為消息摘要算法第五版)為計(jì)算機(jī)安全領(lǐng)域廣泛使用的一種散列...
閱讀 2827·2021-10-12 10:12
閱讀 2502·2021-09-02 15:41
閱讀 2651·2019-08-30 15:55
閱讀 1491·2019-08-30 13:05
閱讀 2577·2019-08-29 11:21
閱讀 3629·2019-08-28 17:53
閱讀 3157·2019-08-26 13:39
閱讀 868·2019-08-26 11:50