摘要:第三階段這種方式是在實習中學習到的,也就是對密碼來進行加鹽。什么是加鹽在密碼學中,是指通過在密碼任意固定位置插入特定的字符串,讓散列后的結果和使用原始密碼的散列結果不相符,這種過程稱之為加鹽。
寫在前面
本文描述了本人,對于數據庫中如何保存密碼的認識過程。從最簡單的明文保存到密碼加鹽保存,下面與大家分享下:
第一階段最開始接觸web開發時,對于用戶表的密碼基本是明文保存,如:
username | password ---------|---------- zp1996 |123456 zpy |123456789
這種方式可以說很不安全,一旦數據庫泄漏,那么所以得用戶信息就會被泄漏。之前,國內普遍采用這種方式,造成了很多的事故,如csdn600萬用戶信息泄漏、12306用戶信息泄漏等。
第二階段本人大學做過的所有的項目基本采用的都是這種方式來保存用戶密碼,就是對密碼進行md5加密,在php中md5即可,在node中利用crypto模塊就好:
const encrypt = (text) => { return crypto.createHash("md5").update(String(text)).digest("hex"); };
作為初學者的我,認為這種方式是很安全的,因為md5不可逆(指攻擊者不能從哈希值h(x)中逆推出x)而且碰撞幾率低(指攻擊值不能找到兩個值x、x"具有相同的哈希值);然而這種方式也是不安全的,只要枚舉出所有的常用密碼,做成一個索引表,就可以推出來原始密碼,這張索引表也被叫做“彩虹表”(之前csdn600萬用戶明文密碼就是一個很好的素材)。
第三階段這種方式是在實習中學習到的,也就是對密碼來進行加鹽。
什么是加鹽?在密碼學中,是指通過在密碼任意固定位置插入特定的字符串,讓散列后的結果和使用原始密碼的散列結果不相符,這種過程稱之為“加鹽”。
加鹽很好理解,就是給原始密碼加上特定的字符串,這樣給攻擊者增加攻擊的成本,加鹽的關鍵在于如何選擇鹽:
固定字符串采用固定的字符串作為鹽,如下面這樣:
const encrypt = (text) => { text = text + "zp"; return crypto.createHash("md5").update(text).digest("hex"); };
這種加鹽方式與多進行幾次md5一樣的,沒有任何意義,攻擊者都可以拿到數據庫,難道拿不到源代碼嗎,根據源代碼攻擊者很輕松的就可以構造新的彩虹表出來逆推密碼。
隨機字符串鹽一般要求是固定長度的隨機字符串,且每個用戶的鹽不同,比如10位,數據庫可以這樣存儲:
username | password |salt ---------|---------—------------------------|---------- zp1996 |2636fd8789595482abf3423833901f6e |63UrCwJhTH zpy |659ec972c3ed72d04fac7a2147b5827b |84GljVnhDT
采用的加密方式為:
md5(md5(password) + salt)
將其轉化為node代碼:
/* * 10位鹽 * 時間戳(2)+隨機字母(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()); };寫在最后
以隨機字符串作為鹽對密碼進行加鹽僅僅是增加破解密碼的難度,假如目前有30w的用戶數據,那么就會有30w個鹽,利用600w的索引表去比對的話,需要創造出30w*600w的數據來一一比對,這樣會增加攻擊者的成本。以上內容,如有錯誤,歡迎大家指出。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/88113.html
摘要:沒錯,年的破解就是證明了在碰撞上面不可靠,也就是可以通過某種方式快速的找到具有相同散列值的另一個信息。好,第二個不安全的誤區來了上述破解過程對于絕大多數散列函數來說,基本上都是一個道理。 轉載請注明出處 http://www.paraller.com 原文排版地址 點擊獲取更好閱讀體驗 轉載: http://blog.sina.com.cn/s/blog_77e8d1350100w...
摘要:加密工具模塊提供了加密功能,包括對的哈希加密解密簽名以及驗證功能的一整套封裝。當然也是優缺點的加密相同的字符是結果都是相同的碼,會出現撞庫的風險。 nodejs-crypto 加密工具 crypto 模塊提供了加密功能,包括對 OpenSSL 的哈希、MD5、HMAC、加密、解密、簽名、以及驗證功能的一整套封裝。 crypto 常用的MD5 MD5 是一種不可逆的加密算法,目前是最牢靠...
摘要:的作用是讓大容量信息在用數字簽名軟件簽署私人密鑰前被壓縮成一種保密的格式就是把一個任意長度的字節串變換成一定長的十六進制數字串。獲取由位隨機大小寫字母數字組成的值每次從中隨機取一位獲取原始密碼的值原始密碼隨機生成位加密后的密碼 MD5是什么 下面的概念是百度百科的: Message Digest Algorithm MD5(中文名為消息摘要算法第五版)為計算機安全領域廣泛使用的一種散列...
閱讀 2697·2021-10-12 10:12
閱讀 2338·2021-09-02 15:41
閱讀 2567·2019-08-30 15:55
閱讀 1404·2019-08-30 13:05
閱讀 2437·2019-08-29 11:21
閱讀 3539·2019-08-28 17:53
閱讀 3032·2019-08-26 13:39
閱讀 804·2019-08-26 11:50