掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
前言

寶山網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站設(shè)計(jì)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)公司于2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司。
開發(fā)網(wǎng)站登錄功能時(shí),如何保證密碼在傳輸過程/儲(chǔ)存的安全?
相信不少前后端的朋友,在面試時(shí)都會(huì)被問到類似的問題。
在我對(duì)密碼學(xué)一無(wú)所知時(shí),也僅會(huì)回答:“MD5加密啊?!?/p>
諸不知,密碼學(xué)在網(wǎng)絡(luò)七層模型,甚至web開發(fā)中的應(yīng)用比我想象得多得多。
1. 什么是密碼學(xué)?
密碼學(xué)是各種安全應(yīng)用程序所必需的,現(xiàn)代密碼學(xué)旨在創(chuàng)建通過應(yīng)用數(shù)學(xué)原理和計(jì)算機(jī)科學(xué)來(lái)保護(hù)信息的機(jī)制。但相比之下,密碼分析旨在解密此類機(jī)制,以便獲得對(duì)信息的非法訪問。
密碼學(xué)具有三個(gè)關(guān)鍵屬性:
例如個(gè)人醫(yī)療數(shù)據(jù):
在本文中,我們將從加密,哈希,編碼和混淆四種密碼學(xué)基礎(chǔ)技術(shù)來(lái)入門。
2. 什么是加密?
加密定義:以保證機(jī)密性的方式轉(zhuǎn)換數(shù)據(jù)的過程。
為此,加密需要使用一個(gè)保密工具,就密碼學(xué)而言,我們稱其為“密鑰”。
加密密鑰和任何其他加密密鑰應(yīng)具有一些屬性:
2.1 加密的分類:對(duì)稱和非對(duì)稱
加密分為兩類:對(duì)稱和非對(duì)稱
對(duì)稱加密:
用途:文件系統(tǒng)加密,Wi-Fi 保護(hù)訪問(WPA),數(shù)據(jù)庫(kù)加密(例如信用卡詳細(xì)信息)
非對(duì)稱加密:
用途:TLS,VPN,SSH。
其主要區(qū)別是:所需的密鑰數(shù)量:
能被密碼界承認(rèn)的加密算法都是公開的:
3. 什么是哈希?
哈希算法定義:·一種只能加密,不能解密的密碼學(xué)算法,可以將任意長(zhǎng)度的信息轉(zhuǎn)換成一段固定長(zhǎng)度的字符串。
加密算法是可逆的(使用密鑰),并且可以提供機(jī)密性(某些較新的加密算法也可以提供真實(shí)性),而哈希算法是不可逆的,并且可以提供完整性,以證明未修改特定數(shù)據(jù)。
哈希算法的前提很簡(jiǎn)單:給定任意長(zhǎng)度的輸入,輸出特定長(zhǎng)度的字節(jié)。在大多數(shù)情況下,此字節(jié)序列對(duì)于該輸入將是唯一的,并且不會(huì)給出輸入是什么的指示。換一種說法:
為了說明這一點(diǎn),請(qǐng)想象一個(gè)強(qiáng)大的哈希算法通過將每個(gè)唯一輸入放在其自己的存儲(chǔ)桶中而起作用。當(dāng)我們要檢查兩個(gè)輸入是否相同時(shí),我們可以簡(jiǎn)單地檢查它們是否在同一存儲(chǔ)桶中。
散列文件的存儲(chǔ)單位稱為桶(Bucket)
3.1 例子一:資源下載
提供文件下載的網(wǎng)站通常會(huì)返回每個(gè)文件的哈希值,以便用戶可以驗(yàn)證其下載副本的完整性。
例如,在Debian的圖像下載服務(wù)中,您會(huì)找到其他文件,例如SHA256SUMS,其中包含可供下載的每個(gè)文件的哈希輸出(在本例中為SHA-256算法)。
在終端中,可以用openssl來(lái)對(duì)文件進(jìn)行哈希處理:
- $ openssl sha256 /Users/hiro/Downloads/非對(duì)稱.png
- SHA256(/Users/hiro/Downloads/非對(duì)稱.png)= 7c264efc9ea7d0431e7281286949ec4c558205f690c0df601ff98d59fc3f4f64
同一個(gè)文件采用相同的hash算法時(shí),就可以用來(lái)校驗(yàn)是否同源。
在強(qiáng)大的哈希算法中,如果有兩個(gè)不同的輸入,則幾乎不可能獲得相同的輸出。
而相反的,如果計(jì)算后的結(jié)果范圍有限,就會(huì)存在不同的數(shù)據(jù)經(jīng)過計(jì)算后得到的值相同,這就是哈希沖突。(兩個(gè)不同的數(shù)據(jù)計(jì)算后的結(jié)果一樣)
這種稱為:哈希碰撞(哈希沖突)。
如果兩個(gè)不同的輸入最終出現(xiàn)在同一個(gè)存儲(chǔ)桶中,則會(huì)發(fā)生沖突。如MD5和SHA-1,就會(huì)出現(xiàn)這種情況。這是有問題的,因?yàn)槲覀儫o(wú)法區(qū)分哪個(gè)碰撞的值匹配輸入。
強(qiáng)大的哈希算法幾乎會(huì)為每個(gè)唯一輸入創(chuàng)建一個(gè)新存儲(chǔ)桶。
3.2 例子二:網(wǎng)站登陸
在web開發(fā)中,哈希算法使用最頻繁的是在網(wǎng)站登陸應(yīng)用上:
絕大多數(shù)的網(wǎng)站,在將登陸數(shù)據(jù)存入時(shí),都會(huì)將密碼哈希后存儲(chǔ)。
注冊(cè):
登陸:
哈希算法的一個(gè)有趣的方面是:無(wú)論輸入數(shù)據(jù)的長(zhǎng)度如何,散列的輸出始終是相同的長(zhǎng)度。
從理論上講,碰撞沖突將始終在可能性的范圍之內(nèi),盡管可能性很小。
與之相反的是編碼。
4. 什么是編碼?
編碼定義:將數(shù)據(jù)從一種形式轉(zhuǎn)換為另一種形式的過程,與加密無(wú)關(guān)。
它不保證機(jī)密性,完整性和真實(shí)性這三種加密屬性,因?yàn)椋?/p>
4.1 URL編碼
又叫百分號(hào)編碼,是統(tǒng)一資源定位(URL)編碼方式。URL地址(常說網(wǎng)址)規(guī)定了:
現(xiàn)在已經(jīng)成為一種規(guī)范了,基本所有程序語(yǔ)言都有這種編碼,如:
編碼方法很簡(jiǎn)單,在該字節(jié)ascii碼的 16 進(jìn)制字符前面加%. 如 空格字符,ascii碼是 32,對(duì)應(yīng) 16 進(jìn)制是'20',那么urlencode編碼結(jié)果是:%20。
- # 源文本:
- The quick brown fox jumps over the lazy dog
- # 編碼后:
- #!shell
- %54%68%65%20%71%75%69%63%6b%20%62%72%6f%77%6e%20%66%6f%78%20%6a%75%6d%70%73%20%6f%76%65%72%20%74%68%65%20%6c%61%7a%79%20%64%6f%67
4.2 HTML實(shí)體編碼
在HTML中,需要對(duì)數(shù)據(jù)進(jìn)行HTML編碼以遵守所需的HTML字符格式。轉(zhuǎn)義避免 XSS 攻擊也是如此。
4.3 Base64/32/16編碼
base64、base32、base16可以分別編碼轉(zhuǎn)化 8 位字節(jié)為 6 位、5 位、4 位。
16,32,64 分別表示用多少個(gè)字符來(lái)編碼,
Base64常用于在通常處理文本數(shù)據(jù)的場(chǎng)合,表示、傳輸、存儲(chǔ)一些二進(jìn)制數(shù)據(jù)。包括MIME的email,email via MIME,在XML中存儲(chǔ)復(fù)雜數(shù)據(jù)。
編碼原理:
Base64編碼要求把 3 個(gè) 8 位字節(jié)轉(zhuǎn)化為 4 個(gè) 6 位的字節(jié)
之后在 6 位的前面補(bǔ)兩個(gè) 0,形成 8 位一個(gè)字節(jié)的形式
6 位 2 進(jìn)制能表示的最大數(shù)是 2 的 6 次方是 64,這也是為什么是 64 個(gè)字符的原因
A-Z,a-z,0-9,+,/這 64 個(gè)編碼字符,=號(hào)不屬于編碼字符,而是填充字符
Base64映射表,如下:
舉個(gè)栗子:
上面的示例旨在指出,編碼的用例僅是數(shù)據(jù)處理,而不為編碼的數(shù)據(jù)提供保護(hù)。
4. 什么是混淆?
混淆定義:將人類可讀的字符串轉(zhuǎn)換為難以理解的字符串。
盡管不能保證機(jī)密性,但混淆仍有其它應(yīng)用:
但是,如此存在許多有助于消除應(yīng)用程序代碼混淆的工具。那就是其它話題了。。。
4.1 例子一:JavaScript混淆
JavaScript源代碼:
- function hello(name) {
- console.log('Hello, ' + name);
- }
- hello('New user');
混淆后:
- var _0xa1cc=["\x48\x65\x6C\x6C\x6F\x2C\x20","\x6C\x6F\x67","\x4E\x65\x77\x20\x75\x73\x65\x72"];
- function hello(_0x2cc8x2){console[_0xa1cc[1]](_0xa1cc[0]+ _0x2cc8x2 "_0xa1cc[1]")}hello(_0xa1cc[2])
總結(jié)
從機(jī)密性,完整性,真實(shí)性分析四種密碼技術(shù):
附錄:哈希函數(shù)常用的哈希函數(shù):
在密碼學(xué)界有句常話:越慢的算法越安全。算法越算,黑客破解成本越高:
通過salt和const這兩個(gè)值來(lái)減緩加密過程,ta 的加密時(shí)間(百 ms 級(jí))遠(yuǎn)遠(yuǎn)超過md5(大概1ms左右)。
對(duì)于計(jì)算機(jī)來(lái)說,Bcrypt 的計(jì)算速度很慢,但是對(duì)于用戶來(lái)說,這個(gè)過程不算慢。
bcrypt是單向的,而且經(jīng)過salt和cost的處理,使其受rainbow攻擊破解的概率大大降低,同時(shí)破解的難度也提升不少。
相對(duì)于MD5等加密方式更加安全,而且使用也比較簡(jiǎn)單.
后記 & 引用
那么,如何保證密碼在傳輸過程/儲(chǔ)存的安全呢?
參考資料
How Secure Are Encryption, Hashing, Encoding and Obfuscation?: https://auth0.com/blog/how-secure-are-encryption-hashing-encoding-and-obfuscation/#What-is-Encoding-
引自:一篇文章徹底弄懂Base64編碼原理: https://blog.csdn.net/wo541075754/article/details/81734770
How Secure Are Encryption, Hashing, Encoding and Obfuscation?: https://auth0.com/blog/how-secure-are-encryption-hashing-encoding-and-obfuscation/#What-is-Encoding-
CTF中那些腦洞大開的編碼和加密: https://www.cnblogs.com/godoforange/articles/10850493.html
散列文件的存儲(chǔ)——‘桶’: https://blog.csdn.net/Dearye_1/article/details/78492021

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流