編碼涨醋、加密和 Hash

Hash

定義

散列函數(shù)(英語:Hash function)又稱散列算法、哈希函數(shù)逝撬,是一種從任何一種數(shù)據(jù)中創(chuàng)建小的數(shù)字“指紋”的方法浴骂。散列函數(shù)把消息或數(shù)據(jù)壓縮成摘要,使得數(shù)據(jù)量變小宪潮,將數(shù)據(jù)的格式固定下來溯警。該函數(shù)將數(shù)據(jù)打亂混合趣苏,重新創(chuàng)建一個叫做散列值(hash values梯轻,hash codes食磕,hash sums,或hashes)的指紋彬伦。散列值通常用一個短的隨機(jī)字母和數(shù)字組成的字符串來代表。好的散列函數(shù)在輸入域中很少出現(xiàn)散列沖突搂橙。在散列表和數(shù)據(jù)處理中,不抑制沖突來區(qū)別數(shù)據(jù)蜗帜,會使得數(shù)據(jù)庫記錄更難找到。 —— Wikipedia-Hash

簡單來說就是 Hash 這種算法可以把任意數(shù)據(jù)轉(zhuǎn)換成指定的大小范圍(通常在256字節(jié)以內(nèi))的數(shù)據(jù)资厉。

作用

Hash 把數(shù)據(jù)壓縮成摘要厅缺,因此最主要用途是數(shù)字指紋。

實際用途

  • 唯一性驗證:Java 中的 hashCode() 方法宴偿。
  • 數(shù)據(jù)完整性驗證:從網(wǎng)絡(luò)下載文件時湘捎,為防止文件傳輸中丟失,文件提供方都會給出完整文件的 hash 值窄刘,用于完整性校驗
  • 快速查找:HashMap
  • 隱私保護(hù):當(dāng)重要數(shù)據(jù)必須暴露時窥妇,可以選擇暴露它的 Hash 值(MD5、SHA2等)娩践,例如網(wǎng)站登錄時活翩,可以只保存用戶密碼的 Hash 值,每次登錄時只需將密碼的 Hash 值和數(shù)據(jù)庫中的 Hash 值作比較翻伺,網(wǎng)站無需存儲用戶密碼材泄,這樣在網(wǎng)站數(shù)據(jù)被盜時可以有效防止撞庫等風(fēng)險

Hash 是編碼嗎?

不是吨岭。Hash 是單向過程拉宗,Hash 值不可逆向成數(shù)據(jù)(4GB 大小的一個 mkv 文件,Hash 值也只是一個字符串而已,不可能從這個字符串恢復(fù)成原文件)旦事,因此 Hash 不屬于編碼魁巩。

Hash 是加密嗎?

不是姐浮。加密和解密是對應(yīng)的谷遂,Hash 是單向過程,無法進(jìn)行逆向操作单料,因此 Hash 不屬于加密埋凯。

加密

對稱加密

  • 原理:使用密鑰和加密算法對數(shù)據(jù)進(jìn)行轉(zhuǎn)換,得到無意義的數(shù)據(jù)即密文扫尖;使用密鑰和解密算法對密文進(jìn)行逆向轉(zhuǎn)換白对,得到原數(shù)據(jù)。
image.png
  • 經(jīng)典算法:DES换怖,AES

非對稱加密

非對稱加密可以說是現(xiàn)代計算機(jī)網(wǎng)路通訊的安全基石甩恼,無論你是否了解或者聽說過它,只要你使用聯(lián)網(wǎng)的電子設(shè)備沉颂,就會用到它条摸。

  • 原理:使用公鑰對數(shù)據(jù)進(jìn)行加密得到密文;使用私鑰對數(shù)據(jù)進(jìn)行解密得到原數(shù)據(jù)铸屉。
image.png

用一個簡單的例子來解釋一下非對稱加密:A 要發(fā)送一個消息110給 B,B 自己先生成一對密鑰(公鑰p 和 私鑰q)彻坛,這對密鑰有一個對應(yīng)關(guān)系顷啼,那就是 p+q=10,這里假設(shè)(p=4昌屉;q=6)钙蒙,B 把公鑰 4 發(fā)給 A,A 再把110每位加 4 變成密文554發(fā)給 B间驮,然后 B 拿到密文554之后使用私鑰每位加 6 變成111110然后把每一位的結(jié)果 -10 得到110躬厌,這樣 B 就拿到了原文。

3551539-ffdc7c4db9235858c.png

同理竞帽,B 如果要給 A 發(fā)送消息扛施,那么 B 就用 A 的公鑰加密消息發(fā)給 A,然后 A 再用自己的私鑰解密消息就好了屹篓,所以非對稱加密的安全關(guān)鍵就是私鑰不對外公開并且只有自己的私鑰才能解自己的公鑰疙渣,這樣就解決了對稱加密通訊中密鑰傳輸丟失的風(fēng)險,因為 A 根本不需要把私鑰發(fā)送給 B抱虐,而發(fā)送出去的公鑰不能用來解密消息。以上示例的整個通訊過程就是非對稱加密通訊的核心思想饥脑。

上圖的模型中加密算法就是加法恳邀,公鑰就是 4懦冰,私鑰就是 6,其中加密算法和公鑰是公開的谣沸,示例模型中拿到公鑰和密文是可以推導(dǎo)出原數(shù)據(jù)的刷钢,而實際應(yīng)用中的加密算法十分復(fù)雜并且通過公鑰和密文無法推導(dǎo)出原數(shù)據(jù),具體可以參考非對稱加密算法 RSA 的算法原理乳附。

簽名和驗證

通過了解非對稱加密我們可以知道同一對密鑰中私鑰是可以解公鑰的内地,那么思考一下公鑰是否可以解私鑰?
我們不妨仔細(xì)看一下非對稱加密解密過程:

image.png

如上圖所示赋除,A 通過公鑰+加密算法得到 B阱缓,B 通過私鑰+加密算法得到 C,因為 C = A举农,所以用公鑰再加密一下 C 就可以得到 B 而形成一個循環(huán)荆针,所以公鑰也可以解私鑰加密的數(shù)據(jù)。

于是颁糟,我們就可以用私鑰給數(shù)據(jù)做簽名航背,然后對方收到簽名數(shù)據(jù)用公鑰解密做校驗;在實際應(yīng)用中由于文件大小的不可控棱貌,給文件直接簽名效率很低玖媚,所以一般都是給文件的 hash 值做簽名,因為 hash 的最主要用途就是數(shù)字指紋婚脱,因此通過比對兩個文件的 hash 值是否相等來校驗兩個文件是否相等是普遍的文件校驗手段今魔。通過非對稱加密來簽名和校驗文件的過程如下:

image.png

從上圖中不難看出,我們給數(shù)據(jù)簽名的目的只有一個:保證接受方收到的數(shù)據(jù)就是我發(fā)出去的數(shù)據(jù)起惕,中途沒有丟失或被篡改涡贱。
我們從大部分網(wǎng)站上下載一些文件,為安全起見一般他們都會給出文件的 hash 值惹想,用來和你下載到本地的文件做完整性和一致性的校驗问词。
所以給文件簽名的邏輯就是:我要發(fā)送一個文件給對方,那我怎么保證我的文件不會被篡改或丟失嘀粱?把文件的 hash 也發(fā)過去激挪。那我怎么保證我的 hash 不會被篡改?把 hash 進(jìn)行簽名和文件一起發(fā)過去锋叨。

Base64

定義

Base64是一種基于64個可打印字符來表示二進(jìn)制數(shù)據(jù)的表示方法垄分。由于 {\displaystyle 2^{6}=64} {\displaystyle 2^{6}=64},所以每6個比特為一個單元娃磺,對應(yīng)某個可打印字符薄湿。3個字節(jié)有24個比特,對應(yīng)于4個Base64單元,即3個字節(jié)可由4個可打印字符來表示豺瘤。它可用來作為電子郵件的傳輸編碼吆倦。在Base64中的可打印字符包括字母A-Z、a-z坐求、數(shù)字0-9蚕泽,這樣共有62個字符,此外兩個可打印符號在不同的系統(tǒng)中而不同桥嗤。一些如uuencode的其他編碼方法须妻,和之后BinHex的版本使用不同的64字符集來代表6個二進(jìn)制數(shù)字,但是不被稱為Base64泛领。 —— Wikipedia-Base64

簡單理解就是 Base64 是一種能將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成有 64 個字符組成的字符串的編碼算法荒吏。

算法

將原數(shù)據(jù)每 6 位對應(yīng)成 Base 64 索引表中的一個字符并編排成一個字符串(每個字符 8 位)。

Base64 索引表:

image.png

編碼“Man”

image.png

末尾補(bǔ)齊

image.png

用途

  • 將二進(jìn)制數(shù)據(jù)的存儲方式和傳輸途徑進(jìn)行了擴(kuò)充(例如可以把圖片經(jīng)過編碼保存到文本文件师逸、可以通過聊天對話框或短信形式發(fā)送司倚、可以在 URL 中加入簡單的二進(jìn)制數(shù)據(jù))
  • 普通的字符串在經(jīng)過 Base64 編碼后結(jié)果會變得肉眼不可讀,因此適用于一定條件下的防偷窺

缺點(diǎn)

因為自身原理(6 位變 8 位)篓像,因此每次 Base64 編碼之后动知,數(shù)據(jù)都會增大約 1/3,所以會影響存儲和傳輸性能员辩。

變種:Base58

比特幣使用的編碼方式盒粮,去掉了 Base64 中的數(shù)字 “0”,大寫字母 “O”奠滑,大寫字母 “I”丹皱,和小寫字母 “l(fā)”,以及 “+” 和 “/” 符號宋税,用于比特幣地址的表示摊崭。

Base58 對于 Base64 的改動,主要目的在于用戶的便攜性杰赛。由于去掉了難以區(qū)分的字符呢簸,使得 Base58 對于“人工抄寫”更加友好。另外乏屯,去掉了“+”根时、“/”號后也讓大多數(shù)如軟件可以方便的雙擊選取。

壓縮與解壓縮

含義

  • 壓縮:將數(shù)據(jù)使用更具有存儲優(yōu)勢的編碼算法進(jìn)行編碼辰晕。
  • 解壓縮:將壓縮數(shù)據(jù)解碼還原成原來的形式蛤迎,以方便使用。

目的

減小數(shù)據(jù)占用的存儲空間含友。

示例

將下面的文本內(nèi)容壓縮:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

使用某種算法壓縮后結(jié)果為:

compress:a:1024;b:105

注:實際應(yīng)用場景中的壓縮算法非常復(fù)雜替裆,上面只是一種演示原型校辩。

壓縮是編碼嗎?

是辆童。所謂編碼召川,即把數(shù)據(jù)從一種形式轉(zhuǎn)換為另一種形式。壓縮過程屬于編碼過程胸遇,解壓縮過程屬于解碼過程。

常見的壓縮算法

JPEG汉形、MP3纸镊、MP4 等。

序列化

把數(shù)據(jù)對象(一般是內(nèi)存中的概疆,例如 JVM 中的對象)轉(zhuǎn)換成字節(jié)序列的過程逗威。對象在程序內(nèi)存里的存放形式是散亂的(存放在不同內(nèi)存區(qū)域、并且由引用進(jìn)行連接)岔冀,通過序列化可以把內(nèi)存中的對象轉(zhuǎn)換成一個字節(jié)序列凯旭,從而使用 byte[] 等形式進(jìn)行本地存儲或網(wǎng)絡(luò)傳輸,在需要的時候進(jìn)行重新組裝(反序列化)來使用使套。

目的

讓內(nèi)存中的對象可以被存儲和傳輸罐呼。

我的博客即將同步至騰訊云+社區(qū),邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=209dz85wu1og0

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末侦高,一起剝皮案震驚了整個濱河市嫉柴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌奉呛,老刑警劉巖计螺,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瞧壮,居然都是意外死亡登馒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門咆槽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陈轿,“玉大人,你說我怎么就攤上這事罗晕〖没叮” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵小渊,是天一觀的道長法褥。 經(jīng)常有香客問我,道長酬屉,這世上最難降的妖魔是什么半等? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任揍愁,我火速辦了婚禮,結(jié)果婚禮上杀饵,老公的妹妹穿的比我還像新娘莽囤。我一直安慰自己,他們只是感情好切距,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布朽缎。 她就那樣靜靜地躺著,像睡著了一般谜悟。 火紅的嫁衣襯著肌膚如雪话肖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天葡幸,我揣著相機(jī)與錄音最筒,去河邊找鬼。 笑死蔚叨,一個胖子當(dāng)著我的面吹牛床蜘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蔑水,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼邢锯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了搀别?” 一聲冷哼從身側(cè)響起弹囚,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎领曼,沒想到半個月后鸥鹉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡庶骄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年毁渗,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片单刁。...
    茶點(diǎn)故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡灸异,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出羔飞,到底是詐尸還是另有隱情肺樟,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布逻淌,位于F島的核電站么伯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏卡儒。R本人自食惡果不足惜田柔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一俐巴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧硬爆,春花似錦欣舵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至袜蚕,卻和暖如春准验,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背廷没。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留垂寥,地道東北人颠黎。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像滞项,于是被迫代替她去往敵國和親狭归。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容