欧美日韩国产一区,亚洲一区视频,色综合久久久久,私密按摩师舌头伸进去了,99re6这里只有精品,夜夜性日日交xxx性hd

3:AES加密與Base64編碼(加解密、簽名系列)

  • • 發(fā)表于 8年前
  • • 作者 Roluce
  • • 13206 人瀏覽
  • • 4 條評(píng)論
  • • 最后編輯時(shí)間 8年前
  • • 來自 [技 術(shù)]

原創(chuàng)聲明:本文為作者原創(chuàng),未經(jīng)允許不得轉(zhuǎn)載,經(jīng)授權(quán)轉(zhuǎn)載需注明作者和出處

0:前情回顧

通過wx.getUserInfo()的success回調(diào)得到的加密數(shù)據(jù)( encryptedData )
對(duì)加密數(shù)據(jù)( encryptedData )解密后可得到openId和unionId。


如何解密,官方文檔是這樣解釋的!

首次看到如上解密說明時(shí),我只知道encryptedData和session_key獲得方式。

session_key在上篇有介紹,如下:
獲得session_key和openId(加解密、簽名系列)

產(chǎn)生的疑問:

1:AES是什么?
2:128是什么?
3:CBC是什么?
4:初始向量iv是做什么用的?
5:數(shù)據(jù)采用PKCS#7填充什么意思?
6:1,2,3,4條分別說明的算法,密文,密鑰,初始向量iv如何組合使用?
7:Base64_Decode又是什么?


1:AES是什么?

美國國家標(biāo)準(zhǔn)技術(shù)研究所在2001年發(fā)布了高級(jí)加密標(biāo)準(zhǔn)(AES)。
AES是基于數(shù)據(jù)塊的加密方式,
即,每次處理的數(shù)據(jù)是一塊(16字節(jié)),當(dāng)數(shù)據(jù)不是16字節(jié)的倍數(shù)時(shí)填充,
這就是所謂的分組密碼(區(qū)別于基于比特位的流密碼),16字節(jié)是分組長(zhǎng)度。

AES是一個(gè)對(duì)稱分組密碼算法。

AES的對(duì)稱性

由于每一步操作都是可逆的,按照相反的順序進(jìn)行解密即可恢復(fù)明文,解密過程分別為對(duì)應(yīng)的逆操作。

AES的分組

分組:AES把看的見的信息(明文),分成很多相同組,對(duì)每組進(jìn)行加密,然后再合成。


2:128是什么?

AES根據(jù)使用的密碼(密鑰)位數(shù),AES最常見的有3種方案,用以適應(yīng)不同的場(chǎng)景要求,
分別是AES-128、AES-192和AES-256。
微信小程序使用的是AES-128。


3:CBC是什么?

AES是基于數(shù)據(jù)塊的加密方式,也就是說,每次處理的數(shù)據(jù)是一塊(16字節(jié)),
當(dāng)數(shù)據(jù)不是16字節(jié)的倍數(shù)時(shí)填充,這就是所謂的分組密碼(區(qū)別于基于比特位的流密碼),16字節(jié)是分組長(zhǎng)度。

即,AES把看的見的信息(明文),分成很多相同組(明文塊),一般為128位(16字節(jié))。
對(duì)每組進(jìn)行單獨(dú)加密,然后再把各加密塊拼接成一條密文。

分組加密的幾種方式

ECB:是一種基礎(chǔ)的加密方式,密文被分割成分組長(zhǎng)度相等的塊(不足補(bǔ)齊),然后單獨(dú)一個(gè)個(gè)加密,一個(gè)個(gè)輸出組成密文。

CBC:是一種循環(huán)模式,前一個(gè)分組的密文和當(dāng)前分組的明文異或操作后再加密,這樣做的目的是增強(qiáng)破解難度。

CFB/OFB實(shí)際上是一種反饋模式,目的也是增強(qiáng)破解的難度。


ECB模式(基礎(chǔ)加密)

處理方式:
密文快[0..n] = 加密算法(明文塊[0…n],密鑰)

特點(diǎn):
1:相同的輸入產(chǎn)生相同的輸出。
2:不能隱藏明文的模式,可能對(duì)明文進(jìn)行主動(dòng)攻擊;

AES默認(rèn)的,最簡(jiǎn)單,但安全性不夠,所以微信用了改良版CBC。


CBC模式(小程序采用)

處理方式:
密文快[0] = 加密算法(初始向量IV,明文塊0,密鑰)

其他密文塊[1…n]=加密算法(之前的密文塊,明文快,密鑰)


這個(gè)模式是鏈?zhǔn)降模笠粔K需要前一塊做基礎(chǔ),第一塊需要一個(gè)需要初始化向量IV做基礎(chǔ)。
相同的輸入產(chǎn)生不同的輸出。
能看到的數(shù)據(jù)是“明文+IV”或“明文+前一個(gè)密文”的亂碼,所以能隱藏明文。

總結(jié):
安全性比第一種好,所以微信小程序用AES-CBC模式,所以需要IV向量
密文 =AES(明文、密鑰、初始向量參數(shù))
明文=AES(密文、密鑰、初始向量參數(shù))


4:PKCS#7填充是什么

因?yàn)锳ES的算法是把明文分組再處理的,他要求每個(gè)分組(16字節(jié))是“滿”的,即明文長(zhǎng)度必須被16字節(jié)整除。
所以明文最后不足的16字節(jié)的要先進(jìn)行數(shù)據(jù)填充,把不足16字節(jié)的最后一組補(bǔ)成16字節(jié)。

所以可知:明文先填充,再AES加密。

例如:明文171字節(jié),最后一節(jié)為11個(gè)字節(jié),需要填充5個(gè)字節(jié)(16-11)



上邊是填充的原理,具體來說,填充方式有很多,PKCS#7是其中一種。

PKCS #7 字符串由一個(gè)字節(jié)序列組成,每個(gè)字節(jié)填充該字節(jié)序列的長(zhǎng)度。


下面的示例演示這些模式的工作原理。

假定塊長(zhǎng)度為 8,數(shù)據(jù)長(zhǎng)度為 9,
則填充用八位字節(jié)數(shù)等于 7,數(shù)據(jù)等于 FF FF FF FF FF FF FF FF FF:
數(shù)據(jù): FF FF FF FF FF FF FF FF FF
PKCS7 填充: FF FF FF FF FF FF FF FF FF 07 07 07 07 07 07 07


5:Base64_Decode

Base64是網(wǎng)絡(luò)上最常見的用于字節(jié)代碼的編碼方式之一(一個(gè)字母就是一字節(jié)byte)
采用Base64編碼具有不可讀性,即所編碼的數(shù)據(jù)不會(huì)被人用肉眼所直接看到。
Base64編碼非常適合HTTP環(huán)境下傳遞較長(zhǎng)的標(biāo)識(shí)信息(傳輸8Bit字節(jié)代碼)

其他應(yīng)用程序中,也常常需要把二進(jìn)制數(shù)據(jù)編碼為適合放在URL中的形式


其實(shí)迅雷的“專用地址”也是用Base64”加密”的,其過程如下:
1、在http://地址的前后分別添加AA和ZZ
2、對(duì)新的字符串進(jìn)行Base64編碼
把迅雷地址還原為http地址,只需要用Base64解碼,然后去掉頭尾的AA和ZZ即可。

迅雷地址Base編碼案例,詳見此文:
http://www.mkhyf.com/topic/711

微信服務(wù)器的操作是:

Base64_Encode(目標(biāo)密文)=encryptedData(wx.getUserInfo得到的)

Base64_Encode(AES密鑰)=session_key

Base64_Encode(初始向量)=iv

所以:

目標(biāo)密文和密鑰aeskey要用Base64解密:

即目標(biāo)密文=Base64_Decode(encryptedData)

即密鑰aeskey=Base64_Decode(session_key)

即初始向量=Base64_Decode(iv)

注意:通過如下官方提供的代碼demo可知,iv也進(jìn)行了Base64的解碼。
文檔上并未說明


6:理解官方文檔

通過上邊的分析,我們知道:
微信小程序用的AES加密算法、AES-128的方案、CBC的分組加密模式(此模式需要IV初始化向量)
AES加密敏感數(shù)據(jù)之前,先用PKCS#7填充“用戶敏感數(shù)據(jù)”最后不足16字節(jié)的部分。
AES對(duì)密文解密后,需用PKCS#7出去填充才能得到真正“用戶敏感數(shù)據(jù)”

知道:
openId,union等敏感數(shù)據(jù)=AES-128-CBC(密文,密鑰,初始向量iv)

第1條:描述的是加密算法和數(shù)據(jù)填充方式
第2條:描述的是如何得到密文(目標(biāo)密文=Base64_Decode(encryptedData))
第3條:描述的是如何得到密鑰(密鑰aeskey=Base64_Decode(session_key))
第4條:描述的是如何得到初始向量iv

上述涉及的數(shù)據(jù):
encryptedData(來自第2條)
通過wx.getUserInfo()的success回調(diào)得到的

iv(來自第4條)
通過wx.getUserInfo()的success回調(diào)得到的

session_key (來自第3條)
1:通過wx.login()的success回調(diào)得到的js_code
2:通過js_code、appid、secret得到session_key

詳情查看如下文章
獲得session_key和openId(加解密、簽名系列)


7:加密解密的全過程

微信服務(wù)器:加密

1:對(duì)敏感用戶信息“目標(biāo)明文”用psck#7號(hào)填充得到“填充文”
2:AES-128-CBC(填充文,密鑰,初始向量)=>目標(biāo)密文
3:Base64_Encode(目標(biāo)密文)=>encryptedData
4:Base64_Encode(初始向量)=>iv
5:Base64_Encode(密鑰)=session_key

后臺(tái)服務(wù)器:解密

1:通過wx.getUserInfo()獲得密文crypteddata,iv
2:通過wx.login()得到的js_code和http接口得到session_key(詳情請(qǐng)看)
3:Base64_Decode(encryptedData)=>目標(biāo)密文
4:Base64_Decode(session_key)=>即密鑰aeskey
5:Base64_Decode(iv)=>初始向量
6:AES-128-CBC(目標(biāo)密文,密鑰,初始向量)=>填充文
7:用psck#7對(duì)填充文去除填充得到敏感的用戶信息“目標(biāo)明文”

分享到:
4條評(píng)論
Ctrl+Enter
作者

Roluce

Roluce

APP:0 帖子:50 回復(fù):112 積分:3610

已加入社區(qū)[3101]天

山東_聊城_qq:635068

作者詳情》
Top