編碼加密和登錄授權(quán)

加密

古典密碼學(xué)

起源于古代戰(zhàn)爭(zhēng):在戰(zhàn)爭(zhēng)中為了防止書(shū)信被截獲后重要信息泄露,人們開(kāi)始對(duì)書(shū)信進(jìn)行加密

移位式加密

如密碼棒,使用布條纏繞在木棒上的方式來(lái)對(duì)書(shū)信進(jìn)行加密。


image

加密算法:纏繞后書(shū)寫(xiě)
密鑰:木棒的尺寸

替換式加密

按照規(guī)則使用不同的文字來(lái)替換掉原先的文字來(lái)進(jìn)行加密

碼表:
原始字符:ABCDEFGHIJKLMNOPQRESTUVWXXYZ
密碼字符:BCDEFGHIJKLMNOPQRESTUVWXXYZA

原始書(shū)信:I love you
加密書(shū)信:j mpwf zpv
解讀后:I love you

加密算法:替換文字
密鑰:替換的碼表

現(xiàn)代密碼學(xué)

  1. 可以加密任何二進(jìn)制數(shù)據(jù)
  2. 非對(duì)稱加密的出現(xiàn)使得密碼學(xué)有了更廣泛的用途:數(shù)字簽名
對(duì)稱加密
原理

通信雙方使用同一密鑰,使用加密算法配合上密鑰來(lái)加密,解密時(shí)使用加密過(guò)程的完全逆過(guò)程配合密鑰來(lái)進(jìn)行解密
簡(jiǎn)化模型即上面古典密碼學(xué)中的替換式加密模型:對(duì)文字進(jìn)行規(guī)則化替換來(lái)加密,對(duì)密文進(jìn)行逆向的規(guī)則化替換來(lái)解密


image
經(jīng)典算法:

DES(56位密鑰) AES(128位,192位,256位)
現(xiàn)在最流行AES加密,DES因密鑰太短而被逐漸棄用

對(duì)稱加密的作用:

加密通信,防止信息在不安全網(wǎng)絡(luò)上被截獲后,信息被人讀取或篡改

對(duì)稱加密(如AES)的破解

破解思路:
1.拿到一組或多組原文-密文對(duì)
2.設(shè)法找到一個(gè)密鑰,這個(gè)密鑰可以將這些原文-密文對(duì)中的原文加密為密文,以及將密文解密為原文的組合,即為成功破解
反破解:
一種優(yōu)秀的對(duì)稱加密算法的標(biāo)準(zhǔn)是:讓破解者找不到比窮舉法更有效的破解手段,并且窮舉法的破解時(shí)間足夠長(zhǎng)(例如數(shù)千年)

對(duì)稱加密的缺點(diǎn)

密鑰泄露:由于密鑰需要傳輸給對(duì)方,所以密鑰有泄露風(fēng)險(xiǎn);一旦密鑰泄露,則加密通信失敗

非對(duì)稱加密
原理

使用公鑰對(duì)數(shù)據(jù)進(jìn)行加密得到密文;使用私鑰對(duì)數(shù)據(jù)進(jìn)行解密得到原數(shù)據(jù)
非對(duì)稱加密使用的是復(fù)雜的數(shù)學(xué)技巧,在古典密碼學(xué)中沒(méi)有對(duì)應(yīng)的原型


image

使用非對(duì)稱加密通信,可以在不可信網(wǎng)絡(luò)上將雙方的公鑰傳給對(duì)方,然后在發(fā)消息前分別對(duì)消息使用對(duì)方的公鑰來(lái)加密和使用自己的私鑰來(lái)簽名,做到不可信網(wǎng)絡(luò)上的可靠密鑰傳播及加密通信


image

由于公鑰和私鑰相互可解(不是解出公鑰和私鑰,而是解出對(duì)方加密的數(shù)據(jù)),因此非對(duì)稱加密還可以應(yīng)用于數(shù)字簽名技術(shù)


image

通常會(huì)對(duì)原數(shù)據(jù)hash以后對(duì)hash簽名,然后附加在元數(shù)據(jù)的后面作為簽名。這是為了讓數(shù)據(jù)更小


image

A使用A的私鑰對(duì)原數(shù)據(jù)的hash簽名,B使用A的公鑰對(duì)簽名進(jìn)行驗(yàn)證
A使用B的公鑰對(duì)原數(shù)據(jù)進(jìn)行加密,B使用B的私鑰對(duì)密文進(jìn)行解密

經(jīng)典算法:

RSA(可用于加密和簽名)
DSA(僅用于簽名,速度更快)

優(yōu)缺點(diǎn):
  • 優(yōu)點(diǎn):可以在不安全網(wǎng)絡(luò)上傳輸密鑰
  • 缺點(diǎn):計(jì)算復(fù)雜,因此性能相比對(duì)稱加密差很多
非對(duì)稱加密的破解

破解思路:
1.和對(duì)稱加密不同的是,非對(duì)稱加密的公鑰很容易獲得,因此制造原文-密文對(duì)是沒(méi)有困難的
2.所以,非對(duì)稱加密的關(guān)鍵只在于,如何找到一個(gè)正確的私鑰,可以解密所有經(jīng)過(guò)公鑰加密的密文。找到這樣的私鑰即為成功破解
3.由于非對(duì)稱加密自身的特性,怎樣通過(guò)公鑰來(lái)推斷出私鑰通常是一種思路(如RSA),但往往最佳手段依然是窮舉法;只是和對(duì)稱加密破解的區(qū)別在于:對(duì)稱加密破解是不斷嘗試自己的新私鑰是否可以將自己拿到的原文-密文對(duì)進(jìn)行加密和解密,而非對(duì)稱加密是不斷嘗試自己的新私鑰是否和公鑰互相可解
反破解:
和對(duì)稱加密一樣非對(duì)稱加密算法優(yōu)秀的標(biāo)準(zhǔn)同樣在于,讓破解者找不到比窮舉法更有效的破解手段,并且窮舉法的破解時(shí)間足夠長(zhǎng)

密碼學(xué)密鑰和登錄密碼

  • 密鑰(key)

    場(chǎng)景:用于加密和解密

    目的:保證數(shù)據(jù)盜取時(shí)不會(huì)被人讀懂內(nèi)容

    焦點(diǎn):數(shù)據(jù)

  • 登錄密碼(password)

    場(chǎng)景:用戶進(jìn)入網(wǎng)站或游戲前的身份驗(yàn)證

    目的:數(shù)據(jù)提供方或應(yīng)用服務(wù)方對(duì)賬戶擁有者數(shù)據(jù)的保護(hù),保證你是你的時(shí)候才提供權(quán)限

    焦點(diǎn):身份

編碼

Base64

定義

將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換由64個(gè)字符組成的字符串編碼算法

什么是二進(jìn)制數(shù)據(jù)?
  • 廣義:所有計(jì)算機(jī)數(shù)據(jù)都是二進(jìn)制數(shù)據(jù)
  • 狹義:非文本數(shù)據(jù)即為二進(jìn)制數(shù)據(jù)
算法

將原數(shù)據(jù)的ASCII碼使用二進(jìn)制(8位)表示,每6位對(duì)應(yīng)成Base64索引表中的一個(gè)字符,然后編排成一個(gè)字符串,若原數(shù)據(jù)長(zhǎng)度不是3的倍數(shù)時(shí)且剩下1個(gè)輸入數(shù)據(jù),則在編碼結(jié)果后加2個(gè)=;若剩下2個(gè)輸入數(shù)據(jù),則在編碼結(jié)果后加1個(gè)=;每三位原字符轉(zhuǎn)換成4位Base64編碼字符,數(shù)據(jù)會(huì)增加1/3
索引表:

image

編碼示例:把Man進(jìn)行Base64編碼


image

編碼示例:Base的末尾補(bǔ)足


image

如果要編碼的字節(jié)數(shù)不能被3整除,最后會(huì)多出1個(gè)或2個(gè)字節(jié),那么可以使用下面的方法進(jìn)行處理:先使用0字節(jié)值在末尾補(bǔ)足,使其能夠被3整除,然后再進(jìn)行Base64的編碼。在編碼后的Base64文本后加上一個(gè)或兩個(gè)=號(hào),代表補(bǔ)足的字節(jié)數(shù)。也就是說(shuō),當(dāng)最后剩余兩個(gè)八位(待補(bǔ)足)字節(jié)(2個(gè)byte)時(shí),最后一個(gè)6位的Base64字節(jié)塊有四位是0值,最后附加上兩個(gè)等號(hào);如果最后剩余一個(gè)八位(待補(bǔ)足)字節(jié)(1個(gè)byte)時(shí),最后一個(gè)6位的base字節(jié)塊有兩位是0值,最后附加一個(gè)等號(hào)。

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

因?yàn)樽陨淼脑?6位變8位),因此每次Base64編碼之后,數(shù)據(jù)都會(huì)增大約1/3,所以會(huì)影響存儲(chǔ)和傳輸性能

Base64 加密圖片傳輸更安全和?效?
這種說(shuō)法不對(duì),首先,Base64并不是加密;另外,Base64會(huì)導(dǎo)致數(shù)據(jù)增大1/3,降低網(wǎng)絡(luò)性能,增大用戶流量開(kāi)銷,是畫(huà)蛇添足的表現(xiàn)
Base對(duì)圖片進(jìn)行編碼的用處在于,有時(shí)需要用文本形式來(lái)傳輸圖片。除此之外,完全沒(méi)有必要使用Base64對(duì)圖片進(jìn)行額外處理

變種:Base58

比特幣使用的編碼方式,去掉了Base64中的數(shù)字0,大寫(xiě)字母O,大寫(xiě)字母I,小寫(xiě)字母l,以及+,/,用于比特幣地址的表示

Base58對(duì)于Base64的改動(dòng),主要目的在于用戶的便捷性。由于去掉了難以區(qū)分的字符,使得Base58對(duì)于人工抄寫(xiě)更加方便。另外,去掉+,/后也讓大多數(shù)的軟件可以方便雙擊選取

URL使用的百分號(hào)編碼

在URL的字符串中,對(duì)一些不用于特殊用途的保留字符,使用%為前綴進(jìn)行單獨(dú)編碼,以避免出現(xiàn)解析錯(cuò)誤。

例如:要在http://hencoder.com/users后面添加查詢字符串,查詢name為隱匿&偉大的用戶,如果直接寫(xiě)成http://hencoder.com/users/?name=隱匿&偉大,&符號(hào)會(huì)被解析為分隔符號(hào),因此需要對(duì)它進(jìn)行轉(zhuǎn)碼,轉(zhuǎn)碼后的URL為http://hencoder.com/users/?name=隱匿%26偉大。這種編碼僅用于URL,目的是避免解析錯(cuò)誤的出現(xiàn)

壓縮和解壓縮

含義
  • 壓縮:將數(shù)據(jù)使用更具有存儲(chǔ)優(yōu)勢(shì)的編碼算法進(jìn)行編碼
  • 解壓縮:將壓縮數(shù)據(jù)解碼還原成原來(lái)的形式,以方便使用
目的

減少數(shù)據(jù)占用的存儲(chǔ)空間

粗暴算法舉例:

將下面文本內(nèi)容壓縮:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
使用某種算法壓縮后的數(shù)據(jù)為: compress:a:1062;b:105 注意:具體的壓縮場(chǎng)景有許多,因此壓縮算法也會(huì)復(fù)雜得多,上面只是一個(gè)原型算法

壓縮是編碼么?

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

常見(jiàn)壓縮算法

DEFLATE,JPEG,MP3等

圖片與音頻,視頻編解碼

含義

將圖片,音頻,視頻數(shù)據(jù)通過(guò)編碼來(lái)轉(zhuǎn)換成存檔形式(編碼),以及從存檔形式轉(zhuǎn)換回來(lái)(解碼)

目的

存儲(chǔ)和壓縮媒體數(shù)據(jù)(大多數(shù)媒體編碼算法會(huì)壓縮數(shù)據(jù),但不是全部)

圖片壓縮粗暴算法舉例

一張純白(白色的16進(jìn)制數(shù)值為0xffffff)的64×64不透明像素圖片,原數(shù)據(jù)格式大致為:
width:64;height:64;ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff.......ffffff
使用某種算法壓縮后的數(shù)據(jù)為:width:64;height:64;ffffff:[0,0]-[63,63] 注意:具體的壓縮場(chǎng)景有許多,因此壓縮算法也會(huì)復(fù)雜得多,上面只是一個(gè)原型算法

?頻與視頻的編碼與上面的圖片編碼同理。

序列化

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

目的

讓內(nèi)存中的對(duì)象可以被存儲(chǔ)和傳輸

序列化是編碼么?

不是,編碼是把數(shù)據(jù)由一種數(shù)據(jù)格式轉(zhuǎn)換成另一種數(shù)據(jù)格式;而序列化是把數(shù)據(jù)由內(nèi)存中的對(duì)象(而不是某種具體的數(shù)據(jù)格式)轉(zhuǎn)換成字節(jié)序列

Hash

定義

把任意數(shù)據(jù)轉(zhuǎn)換成指定大小范圍(通常很小,例如256字節(jié)以內(nèi))的數(shù)據(jù)

作用

相當(dāng)于從數(shù)據(jù)中提取出摘要信息,因此最主要用途是數(shù)字指紋

用途

1. 唯一性驗(yàn)證 例如Java中的hashCode方法
怎么重寫(xiě)hashCode方法?
把equals方法中每個(gè)用于判斷相等的變量都放進(jìn)hashCode()中,一起生成一個(gè)盡量不會(huì)碰撞的整數(shù)即可
為什么每次重寫(xiě)equals()都需要重寫(xiě)hashCode()?
因?yàn)橐研碌呐袛鄺l件放進(jìn)hashCode()中

2.數(shù)據(jù)完整性驗(yàn)證
從網(wǎng)絡(luò)上下載文件后,通過(guò)對(duì)比文件的hash值(如MD5,SHA1),可以確認(rèn)下載的文件是否有損壞。如果下載文件的hash值和文件提供方給出的hash值一致,則證明下載的文件是完好無(wú)損的

3.快速查找
HashMap 會(huì)先用hashCode()進(jìn)行判斷,如果相同,再調(diào)用equals()進(jìn)行判斷

4.隱私保護(hù)
當(dāng)重要數(shù)據(jù)需要暴露時(shí),有時(shí)可以選擇暴露它的hash值(例如MD5),以保障原數(shù)據(jù)的安全。例如網(wǎng)站登錄時(shí),可以只保存用戶密碼的hash值,在每次登錄驗(yàn)證時(shí)只需要將輸入的密碼的hash值和數(shù)據(jù)庫(kù)中保存的Hash值做比較就好,網(wǎng)站無(wú)需知道用戶的密碼。這樣,當(dāng)網(wǎng)站數(shù)據(jù)失竊時(shí),用戶不會(huì)因?yàn)樽约旱拿艽a被盜導(dǎo)致其它網(wǎng)站的安全也會(huì)受到威脅

Hash是編碼么?

不是,Hash是單向過(guò)程,往往是不可逆的,無(wú)法進(jìn)行逆向恢復(fù)操作,因此Hash不屬于編碼

Hash是加密嗎?

不是,Hash是單向過(guò)程,無(wú)法進(jìn)行逆向恢復(fù)操作,因此Hash不屬于加密。(MD5不是加密)

字符集

含義

一個(gè)由整數(shù)向現(xiàn)實(shí)世界中的文字符號(hào)的Map

分支

  • ASCII:128個(gè)字符
  • ISO-8859-1:對(duì)ASCII進(jìn)行擴(kuò)充
  • Unicode:13萬(wàn)個(gè)字符集
    • UTF-8:Unicode編碼分支
    • UTF-16:Unicode編碼分支
  • GBK/GB2312/GB18030:中國(guó)自研標(biāo)準(zhǔn),多字節(jié),字符集+編碼
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 加密與解密 Encryption & Decryption 古典密碼學(xué) 起源:古代戰(zhàn)爭(zhēng) - 古典密碼學(xué),為防止「信...
    valentizx閱讀 1,338評(píng)論 0 1
  • 密碼學(xué) 古典密碼學(xué) : 起源于古代戰(zhàn)爭(zhēng),為了防止書(shū)信被截獲后重要信息泄漏,人們開(kāi)始對(duì)書(shū)信進(jìn)行加密 移位式加密 : ...
    angeliur閱讀 2,002評(píng)論 0 1
  • 1. Base64編碼 Base64是網(wǎng)絡(luò)上最常見(jiàn)的用于傳輸8Bit字節(jié)碼的編碼方式之一,Base64就是一種基于...
    _imp_閱讀 3,052評(píng)論 1 10
  • 1.加密 概念:1.可以對(duì)任意二進(jìn)制數(shù)據(jù)加密2.非對(duì)稱加密的出現(xiàn)使得密碼學(xué)有了更廣泛的用途:數(shù)字簽名 1.1.對(duì)稱...
    花椒人生閱讀 1,231評(píng)論 0 1
  • 概述 之前一直對(duì)加密相關(guān)的算法知之甚少,只知道類似DES、RSA等加密算法能對(duì)數(shù)據(jù)傳輸進(jìn)行加密,且各種加密算法各有...
    Henryzhu閱讀 3,221評(píng)論 0 14

友情鏈接更多精彩內(nèi)容