建站教程:如何設(shè)計(jì)網(wǎng)站安全賬號(hào)系統(tǒng)

2022-05-27    分類: 網(wǎng)站建設(shè)

網(wǎng)站中很多涉及到系統(tǒng)安全保障的設(shè)計(jì),那么,如何設(shè)計(jì)網(wǎng)站安全賬號(hào)系統(tǒng)呢?

我們先來(lái)看下一些著名的安全事件吧:

2011年12月,國(guó)內(nèi)大的程序員社區(qū) CSDN 遭拖庫(kù),600萬(wàn)個(gè)賬戶信息泄露。

2014年3月,攜程旅行網(wǎng)的系統(tǒng)存技術(shù)漏洞,漏洞可能導(dǎo)致用戶的姓名、身份證號(hào)碼、銀行卡類別、銀行卡卡號(hào)、銀行卡CVV碼以及銀行卡6位Bin泄露。

2014年5月,小米論壇涉及800萬(wàn)用戶信息遭泄露,信息包括用戶名、密碼、注冊(cè)IP、郵箱等。 2014年12月,12306遭撞庫(kù)攻擊,13萬(wàn)用戶信息泄露,包括用戶賬號(hào)、明文密碼、身份證、郵箱等敏感信息。

2015年10月,網(wǎng)易郵箱遭攻擊,近5億條用戶信息被泄露,包括用戶名、密碼、密碼保護(hù)信息、登陸IP以及用戶生日等多個(gè)原始信息。

除了密碼泄露事件,數(shù)據(jù)被物理刪除的事件也是發(fā)生:

2015年5月,攜程網(wǎng)及APP陷入癱瘓,數(shù)據(jù)庫(kù)遭物理刪除疑似離職員工報(bào)復(fù)。

這么多大公司大網(wǎng)站的系統(tǒng)都遭到攻擊,泄露用戶信息,更別說(shuō)其他小網(wǎng)站了。這些攻擊都可以從技術(shù)上來(lái)進(jìn)行防范的,但是我們看到即使是大公司,安全方面也是那么的薄弱。

防范方法

防范的方法簡(jiǎn)單來(lái)說(shuō)數(shù)據(jù)從用戶鍵盤(pán)敲出的那一刻,到服務(wù)器后臺(tái)存儲(chǔ)都要保持正確的姿勢(shì)。比如:

用正確的姿勢(shì)保存密碼。 用正確的姿勢(shì)傳輸數(shù)據(jù)。 用正確的姿勢(shì)加密敏感信息。 用正確的姿勢(shì)對(duì)數(shù)據(jù)進(jìn)行備份和監(jiān)控。 用正確的姿勢(shì)保存密碼

這一步非常重要,也比較復(fù)雜。用戶在瀏覽器里輸入密碼,傳輸?shù)椒?wù)器端進(jìn)行驗(yàn)證,服務(wù)端將之前保存的密碼信息和用戶的輸入進(jìn)行比對(duì)。

1. 低級(jí)錯(cuò)誤:明文保存密碼

安全性最低的是在服務(wù)端明文保存用戶的密碼,一旦服務(wù)器被入侵,數(shù)據(jù)被拖走(拖庫(kù)),所有用戶的密碼都直接的暴露在外面。這是最初級(jí)的做法,毫無(wú)安全性可言。假如你在一個(gè)網(wǎng)站或論壇注冊(cè)了一個(gè)賬號(hào),該網(wǎng)站自動(dòng)發(fā)了一封郵件告訴你注冊(cè)成功,里面明文寫(xiě)了你的密碼,趕緊把密碼改了然后再也不要訪問(wèn)這個(gè)網(wǎng)站。

2. 低級(jí)錯(cuò)誤:可逆加密密碼

既然不能明文保存密碼,那當(dāng)然是加密保存了。耍個(gè)小聰明,比如把密碼的字母倒著存,或者每個(gè)字母存后一個(gè)字母,或者進(jìn)行異或混淆處理,表面上密碼看上去已經(jīng)看不出來(lái)原始的密碼是什么了,但實(shí)際上這個(gè)和明文保存密碼并沒(méi)有本質(zhì)區(qū)別,因?yàn)楹诳图热豢梢匀肭帜愕姆?wù)器,自然可以拿到你的加密代碼,只要按你的算法進(jìn)行簡(jiǎn)單的解密就可以得到原始密碼。

3. 錯(cuò)誤方法:md5 加密密碼

在我還是一個(gè)初學(xué)者的時(shí)候,我已被告知不能用前兩種方式保存密碼,當(dāng)時(shí)的主流方法是使用 md5 加密密碼。(年代久遠(yuǎn),現(xiàn)在已絕非主流了。) md5 是一種不可逆的加密方法,即密碼被 md5 加密后是無(wú)法解密出原始密碼的,驗(yàn)證密碼是否正確的方法是將用戶輸入的密碼 md5 加密后于數(shù)據(jù)庫(kù)里保存的 md5 機(jī)密后的結(jié)果進(jìn)行比對(duì)。這樣,服務(wù)器端在不知道真實(shí)用戶密碼的情況下也能對(duì)用戶密碼進(jìn)行驗(yàn)證了。

這是早期比較主流的做法,然而,這依然是非常不安全的。因?yàn)橹灰杜e所有短密碼進(jìn)行 md5 加密,做成一個(gè)索引表,就能輕易的逆推出原始密碼。這種預(yù)先計(jì)算好的用于逆推加密散列函數(shù)的表就是“彩虹表”。隨著“彩虹表”不斷變大,md5 的加密已經(jīng)變得非常的不安全。2015年10月網(wǎng)易郵箱的用戶密碼泄露也被懷疑只對(duì)密碼進(jìn)行了 md5 加密。

4. 正確方法:加鹽 hash 保存密碼

加鹽 hash 是指在加密密碼時(shí),不只是對(duì)密碼進(jìn)行 hash ,而是對(duì)密碼進(jìn)行調(diào)油加醋,放點(diǎn)鹽(salt)再加密,一方面,由于你放的這點(diǎn)鹽,讓密碼本身更長(zhǎng)強(qiáng)度更高,彩虹表逆推的難度更大,也因你放的這點(diǎn)鹽,讓黑客進(jìn)行撞庫(kù)時(shí)運(yùn)算量更大,破解的難度更高。

如何進(jìn)行加鹽就是一門(mén)很重要的學(xué)問(wèn)了。md5 是一種 hash 算法,以下就拿 md5 來(lái)舉例。假如密碼是 123456 ,md5 的結(jié)果如下:

像 123456 這樣的簡(jiǎn)單密碼,是很容易被逆推出來(lái)的。但是假如我們往簡(jiǎn)單密碼里加點(diǎn)鹽試試:

上面例子里的 #g5Fv;0Dvk 就是我們加的鹽。加完之后,密碼的強(qiáng)度更高了,彩虹表破解的難度加大了?;蛘哌M(jìn)行加鹽兩次 md5 :

到這里,你一定會(huì)有疑問(wèn),是不是把 md5 多做幾次,或者自定義一些組合的方式就更安全了。其實(shí)不是的,黑客既然能拿到數(shù)據(jù)庫(kù)里的數(shù)據(jù),也很有可能拿到你的代碼。

一個(gè)健壯的、牢不可破的系統(tǒng)應(yīng)該是:

即使被拿走了數(shù)據(jù)和所有的代碼,也沒(méi)辦法破解里面的數(shù)據(jù)。

這也是為什么大家不必實(shí)現(xiàn)自己的加密算法,而是使用公開(kāi)的加密算法的原因,比如:RSA、AES、DES 等等。既然無(wú)法保證加密代碼不被泄露,那就使用公開(kāi)的加密算法,只要保護(hù)好私鑰信息,就算你知道我的加密方式也沒(méi)有任何幫助。

大部分情況下,使用 md5(md5(password) + salt) 方式加密基本上已經(jīng)可以了:

其中,最關(guān)鍵的是 salt 從哪里來(lái)? salt 該怎么設(shè)置才能安全。

有幾個(gè)重要的點(diǎn):

不要使用固定不變的 salt。 每個(gè)用戶的 salt 都需要不同。 salt 必須由服務(wù)端使用安全的隨機(jī)函數(shù)生成。 客戶端運(yùn)算需要的 salt 需要從服務(wù)端動(dòng)態(tài)獲取。 客戶端加鹽 hash 的結(jié)果并不是最終服務(wù)端存盤(pán)的結(jié)果。

由于客戶端也需要執(zhí)行加鹽 hash ,所以,salt 不能直接寫(xiě)在客戶端,而是應(yīng)該動(dòng)態(tài)從服務(wù)端獲得。服務(wù)端生成隨機(jī)的 salt 時(shí),必須使用安全的隨機(jī)函數(shù),防止隨機(jī)數(shù)被預(yù)測(cè)。

各語(yǔ)言安全的隨機(jī)函數(shù):

就算 salt 值動(dòng)態(tài)從服務(wù)端獲取,也有可能被中間人攔截獲取。同時(shí),客戶端的加鹽 hash 的過(guò)程相當(dāng)于是完全暴露的。一種更安全的做法是,客戶端使用 javascript 進(jìn)行加鹽 hash,把結(jié)果傳到服務(wù)器后,服務(wù)器對(duì)結(jié)果再進(jìn)行一次 加鹽 hash 或者 加密 hash(比如:HMAC) ,然后再和數(shù)據(jù)庫(kù)的結(jié)果進(jìn)行比對(duì)。

如果需要達(dá)到更高的安全等級(jí),可以考慮:

1. 使用更安全的 hash 函數(shù)用來(lái)抵抗碰撞攻擊,比如:SHA256, SHA512, RipeMD, WHIRLPOOL。

兩個(gè)不同的內(nèi)容 hash 的結(jié)果可能相同,攻擊者在不知道真實(shí)密碼的情況下,使用其他密碼進(jìn)行碰撞攻擊從而登錄系統(tǒng)。使用更安全的 hash 函數(shù)可以減少這種情況的發(fā)生。

2. 可以使用一種大量消耗 cpu 的 hash 算法對(duì)抗暴力破解,比如PBKDF2 或者 bcrypt。

暴力破解就是枚舉所有可能的密碼進(jìn)行嘗試驗(yàn)證,使用大量消耗 cpu 的 hash 算法可以極大增加暴力破解的時(shí)間。

3. 比較加鹽 md5 結(jié)果時(shí),使用時(shí)間恒定的比較函數(shù)。

在比較兩個(gè)字符串時(shí),通常都一個(gè)字符一個(gè)字符進(jìn)行比較,如果某個(gè)字符不匹配就會(huì)立即返回。攻擊者可以根據(jù)驗(yàn)證的時(shí)間長(zhǎng)短來(lái)判斷前幾位字符是否正確,然后逐步修正最終得到正確的結(jié)果。

因此,在比較 hash 時(shí),使用時(shí)間恒定的比較函數(shù),可以讓攻擊者摸不著頭腦。比如下面這段代碼:

異或(^)操作可以用來(lái)判斷兩個(gè)字符是否相等,比如:

上面的函數(shù)枚舉每個(gè)字符進(jìn)行異或判斷,然后將所有的結(jié)果取或運(yùn)算,得到最終的結(jié)果,比較的時(shí)間是恒定的。

4. salt 的值不要和最終 hash 的結(jié)果存在同一個(gè)數(shù)據(jù)庫(kù)。

SQL 注入是常見(jiàn)的攻擊手段,被注入后數(shù)據(jù)庫(kù)里的數(shù)據(jù)被暴露無(wú)遺。所以,應(yīng)該將 salt 分開(kāi)存儲(chǔ),存到別的機(jī)器的數(shù)據(jù)庫(kù)里,讓攻擊者拿不到 salt ,從而無(wú)法輕易破解信息。

5. 最終存儲(chǔ)的結(jié)果使用基于 key 的 hash 函數(shù),比如 HMAC。 key 從外部安全性極高的專屬服務(wù)中獲得。

有了這層加固,即使數(shù)據(jù)被拖庫(kù),攻擊者也無(wú)法從 hash 的結(jié)果逆推回原始密碼。因?yàn)槭褂昧思用艿?hash 函數(shù)?;?key 的 hash 函數(shù)只是進(jìn)行哈希運(yùn)算時(shí),除了傳入原始內(nèi)容外,還需要傳入一個(gè)密鑰(key)。攻擊者沒(méi)有 key 幾乎不可能對(duì)數(shù)據(jù)進(jìn)行解密。

key 可以保存在極高安全性的通用的 key 管理系統(tǒng),使用加密協(xié)議傳輸,對(duì)訪問(wèn)者進(jìn)行驗(yàn)證,只允許特定的機(jī)器有權(quán)限訪問(wèn)。

用正確的姿勢(shì)傳輸數(shù)據(jù)

使用 HTTP 協(xié)議傳輸數(shù)據(jù)時(shí),數(shù)據(jù)都是明文傳輸?shù)?,?shù)據(jù)從發(fā)出到服務(wù)器接收,中間可能被劫持,篡改。比如常見(jiàn)的 DNS 劫持,HTTP 劫持,中間人攻擊。

用正確的姿勢(shì)傳輸數(shù)據(jù),目的就是為了保證傳輸?shù)臄?shù)據(jù)安全,簡(jiǎn)單歸納為兩點(diǎn):

需要確保進(jìn)行通訊的服務(wù)端是官方的、正確的服務(wù)端,而不是跟一個(gè)假的服務(wù)端在通信。 確保信息在網(wǎng)絡(luò)上傳輸時(shí)是加密的,只有客戶端和服務(wù)端有能力對(duì)數(shù)據(jù)進(jìn)行解密。 確保信息在傳輸時(shí)不被篡改,或者數(shù)據(jù)被篡改時(shí)能立即發(fā)現(xiàn)。

1. 驗(yàn)證服務(wù)端的合法性

《改變未來(lái)的九大算法》一書(shū)中提到了公鑰加密和數(shù)字簽名技術(shù),這是進(jìn)行安全通信的基礎(chǔ)技術(shù)保障。這里涉及到了加密技術(shù),先了解兩個(gè)最基礎(chǔ)的概念:

對(duì)稱加密:加密和解密時(shí)使用的是同一個(gè)密鑰。 非對(duì)稱加密:需要兩個(gè)密鑰來(lái)進(jìn)行加密和解密:公開(kāi)密鑰(public key,簡(jiǎn)稱公鑰)和私有密鑰(private key,簡(jiǎn)稱私鑰) ,公鑰加密的信息只有私鑰才能解開(kāi),私鑰加密的信息只有公鑰才能解開(kāi)。

非對(duì)稱加密是實(shí)現(xiàn)驗(yàn)證服務(wù)端合法性的基礎(chǔ),常見(jiàn)的加密算法有 RSA 、 ECC 等 。服務(wù)端生成一對(duì)公鑰和私鑰,公鑰是公開(kāi)的所有人都知道,客戶端需要和服務(wù)端通信時(shí),使用該公鑰進(jìn)行數(shù)據(jù)加密,由于只有真實(shí)合法的服務(wù)端才擁有對(duì)應(yīng)的私鑰,所有只有真實(shí)的服務(wù)端才能解密該信息,然后返回?cái)?shù)據(jù)給客戶端時(shí),使用客戶端自己生成的公鑰進(jìn)行加密,這樣數(shù)據(jù)只有對(duì)應(yīng)的客戶端才能理解。

使用 HTTPS 時(shí),數(shù)字證書(shū)里包含了名稱和公鑰信息,只要認(rèn)證該證書(shū)是合法的,并且對(duì)方能理解用該公鑰加密的信息,就能確定是合法的服務(wù)端。

2. 確保通信的安全

既然使用非對(duì)稱加密的方式,可以保證雙方安全的通信,那是不是就一直使用非對(duì)稱加密傳輸數(shù)據(jù)就行了?理論上是可以的,但是非對(duì)稱加密的效率要比對(duì)稱加密的效率低很多。通常的做法是,通過(guò)非對(duì)稱加密的方法,協(xié)商出一個(gè)只有雙方知道的對(duì)稱加密密鑰。

即使在不安全的通信環(huán)境下,也可以協(xié)商出一個(gè)只有雙方才知道的對(duì)稱加密密鑰。在《改變未來(lái)的九大算法》一書(shū)里,有一個(gè)經(jīng)典的描述如何交互密鑰的例子(在所有溝通都是透明的情況下,如何協(xié)商出一個(gè)只有你和阿諾德才知道的顏料顏色。):

ECDH 就是基于上面原理設(shè)計(jì)的密鑰交換算法:

密鑰協(xié)商好后,雙方就可以使用該密鑰進(jìn)行加密傳輸了,比如使用 AES 、 DES。

由于 ECDH 密鑰交換協(xié)議不驗(yàn)證公鑰發(fā)送者的身份,因此無(wú)法阻止中間人攻擊。如果監(jiān)聽(tīng)者 Mallory 截獲了 Alice 的公鑰,就可以替換為他自己的公鑰,并將其發(fā)送給 Bob。Mallory 還可以截獲 Bob 的公鑰,替換為他自己的公鑰,并將其發(fā)送給 Alice。這樣,Mallory 就可以輕松地對(duì) Alice 與 Bob 之間發(fā)送的任何消息進(jìn)行解密。他可以更改消息,用他自己的密鑰對(duì)消息重新加密,然后將消息發(fā)送給接收者。

解決方法是,Alice 和 Bob 可以在交換公鑰之前使用數(shù)字簽名對(duì)公鑰進(jìn)行簽名。

即使攻擊者不能解密傳輸?shù)膬?nèi)容,但仍可以使用重放攻擊嘗試身份驗(yàn)證或用于欺騙系統(tǒng)。重放攻擊是指攻擊者將數(shù)據(jù)包截取后,向目標(biāo)主機(jī)重新發(fā)送一遍數(shù)據(jù)包。

防御重放攻擊的方法主要有:

使用時(shí)間戳。數(shù)據(jù)包在一定時(shí)間范圍內(nèi)才是有效的。 使用遞增的序號(hào)。收到重復(fù)的數(shù)據(jù)包時(shí)可以輕易的發(fā)現(xiàn)。 使用提問(wèn)應(yīng)答方式。收到數(shù)據(jù)包時(shí)可以判斷出來(lái)是否應(yīng)答過(guò)。

HTTPS 正是使用了上述的原理,保證了網(wǎng)站安全維護(hù)。所以,任何對(duì)安全有需求的系統(tǒng)都應(yīng)該使用 HTTPS。如果是使用自有協(xié)議開(kāi)發(fā),比如 APP 或游戲,應(yīng)該使用上述的方法保障通信的安全。

用正確的姿勢(shì)加密敏感信息

我們都知道,用戶的密碼不能明文保存,而且要使用不可逆的加密算法,只保存最終的 hash 結(jié)果用來(lái)驗(yàn)證是否正確。那用戶其他的敏感信息呢?比如身份證、銀行卡、信用卡等信息,該如何加密保存而不被泄露呢?

對(duì)于身份證信息,可以像密碼一樣只保存 hash 的結(jié)果,可以用于用戶輸入身份證號(hào)后進(jìn)行驗(yàn)證。假如需要給用戶顯示身份證信息,只需要保存抹掉了幾位數(shù)字的身份證號(hào)。

假如你的系統(tǒng)涉及到支付,需要用戶的銀行卡,信用卡(卡號(hào),CVV碼)等信息時(shí),必須遵循 PCI DSS (第三方支付行業(yè)數(shù)據(jù)安全標(biāo)準(zhǔn))標(biāo)準(zhǔn)。PCI DSS 是由 PCI 安全標(biāo)準(zhǔn)委員會(huì)的創(chuàng)始成員(visa、mastercard、American Express、Discover Financial Services、JCB等)制定,力在使國(guó)際上采用一致的數(shù)據(jù)安全措施,包括安全管理、策略、過(guò)程、網(wǎng)絡(luò)體系結(jié)構(gòu)、軟件設(shè)計(jì)的要求的列表等,全面保障交易安全。

如果只是銀行卡,還需要遵循 ADSS (銀聯(lián)卡收單機(jī)構(gòu)賬戶信息安全管理標(biāo)準(zhǔn)) 標(biāo)準(zhǔn)。

2014年3月攜程泄露用戶銀行卡信息就是因?yàn)闆](méi)有遵循 PCI DSS 標(biāo)準(zhǔn)。

用正確的姿勢(shì)對(duì)數(shù)據(jù)進(jìn)行備份和監(jiān)控

2015年5月的攜程數(shù)據(jù)被刪事件,就是數(shù)據(jù)備份沒(méi)有做好的例子。數(shù)據(jù)備份是為了防止由于硬盤(pán)損壞或人為破壞導(dǎo)致的數(shù)據(jù)丟失。主要措施有:磁盤(pán) raid,物理備份(磁帶庫(kù)),異地的邏輯備份。同時(shí)做好權(quán)限控制,并對(duì)訪問(wèn)記錄做好監(jiān)控,及時(shí)發(fā)現(xiàn)問(wèn)題,保留現(xiàn)場(chǎng)證據(jù)。

總結(jié)

本文總結(jié)了設(shè)計(jì)一個(gè)安全系統(tǒng)的基本原理和方法,并沒(méi)有舉出一個(gè)特定具體的方案,因?yàn)椴煌南到y(tǒng)對(duì)安全性的要求各有不同,設(shè)計(jì)者應(yīng)該根據(jù)自身系統(tǒng)的特點(diǎn)進(jìn)行具體設(shè)計(jì)。比如加鹽 hash 的具體實(shí)施方法,salt 值如何構(gòu)成等等。

本文所述內(nèi)容如有不實(shí)之處或者有爭(zhēng)議的部分,歡迎交流指出。

附錄

常用的加密算法:

對(duì)稱加密:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK、AES。

非對(duì)稱加密:RSA、ECC(橢圓曲線加密算法)、Diffie-Hellman、El Gamal、DSA(數(shù)字簽名用)

Hash 算法:MD2、MD4、MD5、HAVAL、SHA-1、SHA256、SHA512、RipeMD、WHIRLPOOL、SHA3、HMAC

DES、3DES、AES 區(qū)別:

DES:1976年由美國(guó)聯(lián)邦政府的國(guó)家標(biāo)準(zhǔn)局頒布,密鑰為 56 位。

3DES:DES加密算法的一種模式,它使用3條56位的密鑰對(duì)數(shù)據(jù)進(jìn)行三次加密。

AES:高級(jí)加密標(biāo)準(zhǔn),是下一代的加密算法標(biāo)準(zhǔn),速度快,安全級(jí)別高,用來(lái)替代原先的DES。密鑰長(zhǎng)度可以是128,192或256比特。

文章題目:建站教程:如何設(shè)計(jì)網(wǎng)站安全賬號(hào)系統(tǒng)
標(biāo)題來(lái)源:http://www.muchs.cn/news32/159982.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航做網(wǎng)站、微信公眾號(hào)、建站公司手機(jī)網(wǎng)站建設(shè)、搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)