基于JWE的API加密方案設(shè)計(jì)

前言

在這個(gè)互聯(lián)網(wǎng)和移動(dòng)互聯(lián)網(wǎng)高速發(fā)展的時(shí)代宅静,數(shù)據(jù)安全成了企業(yè)的頭等大事章蚣。數(shù)據(jù)安全的范疇很大,包含:技術(shù)安全姨夹、服務(wù)安全纤垂、存儲(chǔ)安全、傳輸安全等磷账,本文主要是從傳輸安全的層面峭沦,設(shè)計(jì)一種基于JWE的API加密方案。

名詞說(shuō)明

**JWE **

JSON Web Encryption 逃糟,詳細(xì)資料:http://self-issued.info/docs/draft-ietf-jose-json-web-encryption.html

目錄

(一) 安全算法掃盲

(二) 安全方案演變

(三) JWE的介紹

(四) 基于JWE的API加密方案

本文主要講解相關(guān)理論吼鱼,后續(xù)會(huì)有實(shí)踐的更新


(一) 安全算法掃盲

1.信息安全算法

1.1 加密相關(guān)算法

現(xiàn)代密碼學(xué)中,把算法的加密技術(shù)主要分為:

單密鑰模式

雙密鑰模式

無(wú)密鑰模式

單密鑰模式绰咽,也稱為對(duì)稱密鑰模式菇肃,加密和解密方采用同一個(gè)密鑰。采用這種模式的算法就叫做對(duì)稱加密算法取募。

雙密鑰模式巷送,也稱作非對(duì)稱密鑰模式,加密和解密方采用不同的密鑰矛辕。采用這種模式的算法就叫做非對(duì)稱加密算法笑跛。

無(wú)密鑰模式,也稱作隨機(jī)密鑰模式聊品,每次的密鑰都是隨機(jī)生成飞蹂,使用一次之后失效。這是一種理想的加密模式翻屈,由于設(shè)計(jì)難度大陈哑,目前未得到廣泛應(yīng)用。

本文中主要針對(duì)前兩類加密算法進(jìn)行簡(jiǎn)單介紹伸眶。

1.1.1 對(duì)稱加密算法(Symmetric Encryption)

對(duì)稱加密算法惊窖,又稱私鑰加密算法,顧名思義加密和解密過(guò)程中只用到一個(gè)密鑰厘贼,該密鑰也稱作私鑰界酒。

常見(jiàn)的對(duì)稱加密算法有:DES、IDEA(基于DES)嘴秸、3DES(基于DES)毁欣、RC4庇谆、RC5、RC6凭疮、AES饭耳。

特點(diǎn)

Feature 1. 速度較快,可適用于大數(shù)據(jù)加密执解;

Feature 2. 算法公開(kāi)寞肖,密鑰安全決定該算法安全;應(yīng)用過(guò)程中要嚴(yán)格管理密鑰衰腌。

部分算法對(duì)比

算法名 密鑰長(zhǎng)度 運(yùn)算速度 解密時(shí)間(假設(shè)機(jī)器每秒嘗試255個(gè) ) 資源消耗
AES 128新蟆、192、256 1490000億年
3DES 112桶唐、168 45億年
DES 56 較快 無(wú)參考

此數(shù)據(jù)轉(zhuǎn)自:[http://blog.csdn.net/leolewin/article/details/48653351](http://blog.csdn.net/leolewin/article/details/48653351%29 和 [http://blog.csdn.net/dragon_ton/article/details/46651489]%28http://blog.csdn.net/dragon_ton/article/details/46651489)

1.1.2 非對(duì)稱加密算法(Asymmetric Encryption)

非對(duì)稱加密算法栅葡,又稱公私鑰加密算法,顧名思義加密和解密過(guò)程使用不同的密鑰尤泽。公鑰即為公開(kāi)的密鑰欣簇,一般用作加密;私鑰即為私有的密鑰坯约,一般用作解密熊咽。

常見(jiàn)的非對(duì)稱加密算法有:RSA、ECC闹丐、DSA横殴。

特點(diǎn)

Feature 1. 速度慢,用于較小數(shù)據(jù)的加密卿拴;

Feature 2. 安全系數(shù)高

部分算法對(duì)比

算法名 成熟度 安全性 運(yùn)算速度 資源消耗
RSA
DSA 只用于簽名
ECC

數(shù)據(jù)參考:http://blog.csdn.net/dragon_ton/article/details/46651489

1.1.3 對(duì)稱加密和非對(duì)稱加密算法的對(duì)比

算法種類 代表 優(yōu)點(diǎn) 缺點(diǎn)
對(duì)稱加密算法 AES 運(yùn)行速度快
非對(duì)稱加密算 RSA 安全系數(shù)高 運(yùn)行速度慢衫仑、系統(tǒng)開(kāi)銷大

1.2 信息校驗(yàn)相關(guān)算法

信息校驗(yàn)相關(guān)算法主要分為3類:信息摘要、信息認(rèn)證堕花、信息簽名文狱。

1.2.1 信息摘要(MD-Message Digest)

信息摘要又稱數(shù)字摘要,采用單向Hash函數(shù)將需要加密的明文“摘要”成一串固定長(zhǎng)度(128位)的密文這一串密文又稱為數(shù)字指紋缘挽,它有固定的長(zhǎng)度瞄崇,而且不同的明文摘要成密文,其結(jié)果總是不同的壕曼,而同樣的明文其摘要必定一致苏研。

Hash算法又稱散列函數(shù),是一種單向的腮郊,從明文到密文的映射過(guò)程摹蘑。

常見(jiàn)算法的Hash算法有:MD2、MD4伴榔、MD5纹蝴、HAVAL庄萎、SHA-1踪少、SHA256等塘安。

特點(diǎn)

Feature 1. 過(guò)程不可逆。

Feature 2. 輸出數(shù)據(jù)長(zhǎng)度固定援奢。

Feature 3. 保證數(shù)據(jù)的完整性兼犯。

部分算法對(duì)比

算法名 輸出數(shù)據(jù)長(zhǎng)度(bit) 運(yùn)算速度 安全性
MD2 128
MD4 128
MD5 128 較高
SHA1 160 較高
SHA256 256
SHA384 384
SHA512 512

數(shù)據(jù)參考:

1.2.2 消息認(rèn)證(MA-Message Authentication)

消息認(rèn)證是指通過(guò)對(duì)消息或者消息有關(guān)的信息進(jìn)行加密或簽名變換進(jìn)行的認(rèn)證,目的是為了防止傳輸和存儲(chǔ)的消息被有意無(wú)意的篡改集漾,包括消息內(nèi)容認(rèn)證(即消息完整性認(rèn)證)切黔、消息的源和宿認(rèn)證(即身份認(rèn)證0)、及消息的序號(hào)和操作時(shí)間認(rèn)證等具篇。

消息認(rèn)證通常在摘要算法基礎(chǔ)上再做一個(gè)對(duì)稱或非對(duì)稱加密算法纬霞,用于防止信息被竊取,用于證明原文的完整性和準(zhǔn)確性驱显,也就是說(shuō)诗芜,消息認(rèn)證主要用于防止信息被篡改。

常用的消息認(rèn)證算法是含有密鑰散列函數(shù)算法埃疫,兼容了MD和SHA算法的特性伏恐,并在此基礎(chǔ)上加上了密鑰,通常也成為HMAC算法栓霜。

HMAC的詳細(xì)介紹:http://www.ietf.org/rfc/rfc2104.txt

常見(jiàn)的算法有:HMAC-MD2翠桦、HMAC-MD4、HMAC-MD5胳蛮、HMAC-SHA1销凑、HMAC-SHA256、HMAC-SHA384仅炊、HMAC-SHA512斗幼。

特點(diǎn)

Feature 1. 保證數(shù)據(jù)完整性、準(zhǔn)確性

Feature 2. 過(guò)程不可逆

Feature 3. 輸出數(shù)據(jù)長(zhǎng)度固定

部分算法對(duì)比

算法名 輸出數(shù)據(jù)長(zhǎng)度(單位:bit) 運(yùn)算速度
HMAC-MD2 128
HMAC-MD4 128
HMAC-MD5 128
HMAC-SHA1 160
HMAC-SHA256 256
HMAC-SHA384 384
HMAC-SHA512 512

以下為具體測(cè)試數(shù)據(jù)

算法名:HMAC-MD2          循環(huán)次數(shù):10000        總耗時(shí):7943ms
算法名:HMAC-MD4          循環(huán)次數(shù):10000        總耗時(shí):4686ms
算法名:HMAC-SHA51        循環(huán)次數(shù):10000        總耗時(shí):96ms
算法名:HMAC-SHA256       循環(huán)次數(shù):10000        總耗時(shí):91ms
算法名:HMAC-MD5          循環(huán)次數(shù):10000        總耗時(shí):65ms
算法名:HMAC-SHA384       循環(huán)次數(shù):10000        總耗時(shí):100ms
算法名:HMAC-SHA1         循環(huán)次數(shù):10000        總耗時(shí):70ms
算法名:HMAC-MD2          循環(huán)次數(shù):100000       總耗時(shí):62078ms
算法名:HMAC-MD4          循環(huán)次數(shù):100000       總耗時(shí):51112ms
算法名:HMAC-SHA512       循環(huán)次數(shù):100000       總耗時(shí):892ms
算法名:HMAC-SHA256       循環(huán)次數(shù):100000       總耗時(shí):918ms
算法名:HMAC-MD5          循環(huán)次數(shù):100000       總耗時(shí):441ms
算法名:HMAC-SHA384       循環(huán)次數(shù):100000       總耗時(shí):919ms
算法名:HMAC-SHA1         循環(huán)次數(shù):100000       總耗時(shí):768ms

測(cè)試代碼詳見(jiàn):https://github.com/vvvvken/SecurityAlgorithmCompare

1.2.3 數(shù)字簽名(DS-Digital Signature)

數(shù)字簽名技術(shù)是將摘要信息用發(fā)送者的私鑰加密茂洒,與原文一起傳送給接收者鸡岗。接收者只有用發(fā)送者的公鑰才能解密被加密的摘要信息,然后用HASH函數(shù)對(duì)收到的原文產(chǎn)生一個(gè)摘要信息男摧,與解密的摘要信息對(duì)比扳抽。如果相同,則說(shuō)明收到的信息是完整的智哀,在傳輸過(guò)程中沒(méi)有被修改次询,否則說(shuō)明信息被修改過(guò),因此數(shù)字簽名能夠驗(yàn)證信息的完整性瓷叫。

數(shù)字簽名保證信息傳輸?shù)耐暾酝偷酢l(fā)送者的身份認(rèn)證送巡、防止交易中的抵賴發(fā)生。

常用的數(shù)字簽名算法都是信息摘要的基礎(chǔ)上用一個(gè)非對(duì)稱加密算法進(jìn)行加密處理盒卸。

常用的數(shù)字簽名算法有:RSA骗爆、DSA、ECDSA蔽介。

特點(diǎn)

1.保證數(shù)據(jù)的完整性摘投、正確性、不可抵賴性虹蓄。
2.過(guò)程不可逆犀呼。

部分算法對(duì)比

算法 速度 安全性 密鑰交換 用途
RSA 支持 加密、解密薇组、簽名
DSA 較快 較高 不支持 僅用于簽名

1.3 總結(jié)

信息安全相關(guān)的算法簡(jiǎn)單總結(jié)如下表:

算法類型 特點(diǎn) 算法舉例
對(duì)稱加密 - Symmetric Encryption 速度快外臂、可用于處理大數(shù)據(jù)、文件 DES律胀、3DES宋光、AES
非對(duì)稱加密 - Asymmetric Encryption 速度慢、用戶小數(shù)據(jù) RSA累铅、ECC
消息摘要(MD) - Message Digest 完整性 MD2跃须、MD4、MD5娃兽、SHA1菇民、SHA256
消息認(rèn)證(MA) - Message Authentication 完整性、真實(shí)性 HMAC-MD5投储、HMAC-SHA1第练、HMAC-SHA256、HMAC-SHA384
數(shù)字簽名(DS) - Digital Signature 完整性玛荞、真實(shí)性娇掏、不可抵賴性 RSA、DSA勋眯、ECDSA

(二) 安全方案演變

2.1 API數(shù)據(jù)加密方案的演變

2.1.1 HTTP+對(duì)稱加密

在很久很久以前婴梧,互聯(lián)網(wǎng)發(fā)展不久,部分企業(yè)開(kāi)始注重安全客蹋,基于對(duì)稱加密算法塞蹭,設(shè)計(jì)了此方案。

如下圖所示讶坯,用HTTP+AES舉例的整個(gè)交互流程:

整個(gè)過(guò)程中只涉及到AES(對(duì)稱)算法番电,僅且對(duì)傳輸中的數(shù)據(jù)進(jìn)行加密。

安全性

安全項(xiàng) 描述
數(shù)據(jù)安全 通過(guò)AES實(shí)現(xiàn)
數(shù)據(jù)完整性(防篡改) 無(wú)
數(shù)據(jù)真實(shí)性(防偽造) 無(wú),密鑰暴露之后漱办,可以被任意偽造

缺陷

  1. 密鑰單一这刷,無(wú)法實(shí)現(xiàn)動(dòng)態(tài)密鑰管理
  2. 密鑰暴露之后,整套方案的安全性不攻自破

2.1.2 HTTP+對(duì)稱加密+消息摘要

HTTP+對(duì)稱加密這種方式有個(gè)明顯的問(wèn)題娩井,信息在傳輸過(guò)程中可以被任意修改暇屋,無(wú)法保證數(shù)據(jù)的完整性,所以產(chǎn)生了此類方案撞牢。

如下圖所示率碾,用HTTP+AES+HASH摘要舉例的整個(gè)交互流程:

在AES的加密基礎(chǔ)上叔营,做了消息摘要屋彪,服務(wù)端每次進(jìn)行解密之前進(jìn)行摘要驗(yàn)證,保證了數(shù)據(jù)的完整性绒尊。

安全性

安全項(xiàng) 描述
數(shù)據(jù)安全 通過(guò)AES實(shí)現(xiàn)
數(shù)據(jù)完整性(防篡改) 通過(guò)信息摘要實(shí)現(xiàn)
數(shù)據(jù)真實(shí)性(防偽造) 通過(guò)認(rèn)證碼實(shí)現(xiàn)

缺陷

  1. 密鑰單一畜挥,無(wú)法實(shí)現(xiàn)動(dòng)態(tài)密鑰管理
  2. 密鑰暴露之后,整套方案的安全性不攻自破

2.1.3 HTTP+對(duì)稱加密+消息認(rèn)證

HTTP+對(duì)稱加密+消息摘要的方式已經(jīng)在一些對(duì)安全性要求不是特別高的場(chǎng)合下使用了婴谱,但是對(duì)于安全性要求特別高的行業(yè)比如金融蟹但、教育等行業(yè),還有待提高谭羔。所以人們改進(jìn)了摘要機(jī)制华糖,把消息摘要用消息認(rèn)證碼替換,形成了HTTP+對(duì)稱加密+消息認(rèn)證的方案瘟裸。

如下圖所示客叉,用HTTP+AES+HMAC舉例的整個(gè)交互流程:

AES+HMAC.png

此方式的特點(diǎn)是用消息認(rèn)證碼替換摘要,在普通的摘要基礎(chǔ)上增加雙向的校驗(yàn)话告,保證了數(shù)據(jù)的真實(shí)性兼搏。

安全性

安全項(xiàng) 描述
數(shù)據(jù)安全 密鑰一旦暴露,客戶端和服務(wù)端的過(guò)程都被破譯
數(shù)據(jù)完整性(防篡改) 通過(guò)認(rèn)證碼實(shí)現(xiàn)
數(shù)據(jù)真實(shí)性(防偽造) 無(wú)沙郭,密鑰暴露之后佛呻,可以被任意偽造

缺陷

  1. 密鑰單一,無(wú)法實(shí)現(xiàn)動(dòng)態(tài)密鑰管理
  2. 密鑰暴露之后病线,整套方案的安全性不攻自破

2.1.4 HTTP+非對(duì)稱加密

前面的方案都是基于非對(duì)稱加密算法吓著,統(tǒng)一的缺陷就是密鑰單一,無(wú)法實(shí)現(xiàn)動(dòng)態(tài)管理送挑,密鑰本身的安全性得到了很大的威脅绑莺。基于這個(gè)考慮让虐,提出了此方案紊撕。

如下圖所示,用HTTP+RSA舉例過(guò)程:

RSA.png

用非對(duì)稱加密算法赡突,整體替換對(duì)稱加密算法对扶。安全性都得到了保證区赵,唯一的缺陷就是非對(duì)稱加密算法的效率太慢,不適合大數(shù)據(jù)的加密浪南。

安全性

安全項(xiàng) 描述
數(shù)據(jù)安全 通過(guò)RSA實(shí)現(xiàn)
數(shù)據(jù)完整性(防篡改) 通過(guò)RSA實(shí)現(xiàn)
數(shù)據(jù)真實(shí)性(防偽造) RSA的公鑰和私鑰配對(duì)實(shí)現(xiàn)

缺陷

  1. 性能低下笼才,速度慢
  2. 不適用于大數(shù)據(jù)以及文件的加解密

2.1.5 HTTP+對(duì)稱加密+消息認(rèn)證+非對(duì)稱加密

上述所有的方案都有缺陷,缺陷本身來(lái)源于加密算法络凿,那么有沒(méi)有一種辦法把對(duì)稱加密和非對(duì)稱加密結(jié)合起來(lái)骡送,互補(bǔ)對(duì)方的缺陷呢?

答案是肯定絮记,人類的智慧是無(wú)窮摔踱,于是想到這種方案:

報(bào)文用對(duì)稱加密,對(duì)稱算法的密鑰用非對(duì)稱加密怨愤,如下圖所示派敷,用HTTP+AES+認(rèn)證+RSA舉例:

AES+HMAC+RSA.png

從安全的層面,該方案已經(jīng)足夠安全撰洗,能夠達(dá)到絕大數(shù)的安全需求±河洌現(xiàn)在市面上用此類方案的公司也很多。

特點(diǎn)

1差导,AES加密原始報(bào)文试躏,速度快

2,HMAC對(duì)AES結(jié)果認(rèn)證碼设褐,確保數(shù)據(jù)真實(shí)性

3颠蕴,每次AES和HMAC的密鑰都是隨機(jī)生成,達(dá)到動(dòng)態(tài)密鑰的效果

4络断,密鑰的安全由RSA算法保證裁替,數(shù)據(jù)小,發(fā)揮RSA的優(yōu)點(diǎn)

5貌笨,?RSA的密鑰為2組弱判,實(shí)現(xiàn)了雙向認(rèn)證

2.2.JWE的產(chǎn)生

假設(shè)1

假設(shè)我們用json格式來(lái)描述 HTTP+對(duì)稱加密+消息認(rèn)證+非對(duì)稱加密的方案 的數(shù)據(jù),那么json應(yīng)該這樣:

{
    "ciphertext": "...",
    "key": "...",
    "authCode": "...",
}

客戶端和服務(wù)端按照約定的算法進(jìn)行相關(guān)操作锥惋,就可以正確的加解密數(shù)據(jù)昌腰。

假設(shè)2

在假設(shè)1的情況下,在json里面增加算法的描述膀跌,那么json應(yīng)該這樣:

{
    "ciphertext": "...",
    "key": "...",
    "authCode": "...",
    "cipherAlgorithm": "AES128",
    "keyAlgorithm": "RSA1_5",
    "authAlgorithm": "HMAC-SHA256"
}

客戶端和服務(wù)端通信過(guò)程中實(shí)現(xiàn)指定的算法遭商,就可以正確的加解密數(shù)據(jù)。

BINGO捅伤!到這里劫流,我們主角就誕生了

3.1 JWE第一眼

這是一個(gè)使用標(biāo)準(zhǔn)JWE序列化的JSON

{
    "protected": "eyJlbmMiOiJBMTI4Q0JDLUhTMjU2In0",
    "unprotected": {
        "jku": "https://server.example.com/keys.jwks"
    },
    "header": {
        "alg": "A128KW",
        "kid": "7"
    },
    "encrypted_key": "6KB707dM9YTIgHtLvtgWQ8mKwboJW3of9locizkDTHzBC2IlrT1oOQ",
    "iv": "AxY8DCtDaGlsbGljb3RoZQ",
    "ciphertext": "KDlTtXchhZTGufMYmOYGS4HffxPSUrfmqCHXaI9wOGY",
    "tag": "Mz-VPPyU4RlcuYv1IwIvzw"
}

跟假設(shè)2的數(shù)據(jù)字段對(duì)比,有極其相似的字段,也有特有的字段祠汇。

回顧前面的過(guò)程仍秤,從2.1到2.5的算法演變,本質(zhì)上都是安全性本身的提升可很,到了1.5之后诗力,基本達(dá)到了一個(gè)非常安全算法設(shè)計(jì)。為什么會(huì)有JWE的提出呢我抠?接下來(lái)苇本,我們來(lái)認(rèn)識(shí)JWE。

(三) JWE的介紹

JWE是JSON Web Encryption的縮寫(xiě)菜拓,簡(jiǎn)言之:用JSON描述加密瓣窄。

JWE并不神秘,我們一步一步來(lái)了解它

3.1 JWE輸出

3.1.1 輸出數(shù)據(jù)

數(shù)據(jù) 描述
JWE Encrypted Key 密鑰的加密數(shù)據(jù)
JWE Initialization Vector 加密原始報(bào)文用到的向量數(shù)據(jù)
JWE AAD Addtional Authentication Data,附件的認(rèn)證數(shù)據(jù)
JWE Ciphertext 原始報(bào)文的加密數(shù)據(jù)
JWE Authentication Tag 數(shù)字認(rèn)證標(biāo)簽
JWE Protected Header 受保護(hù)的Header字段尘惧,主要包含加密與認(rèn)證相關(guān)的算法說(shuō)明
JWE Shared Unprotected Header 非受保護(hù)的Header字段康栈,除開(kāi)Protected Header的其他信息
JWE Per-Recipient Unprotected Header 單條的Header字段

3.1.2 Header字段

alg 描述密鑰用到的加密算法 {"alg":"RSA-V1_5"} 密鑰使用RSA pkcs1算法進(jìn)行密鑰加密
enc 描述原始保護(hù)的加密算法 以及 認(rèn)證碼的生成算法 {"enc":"A128CBC-HS256"} 原始報(bào)文使用AES算法加密,密鑰長(zhǎng)度為128位喷橙,模式為CBC。認(rèn)證碼算法使用HMAC-SHA256
zip 描述原始報(bào)文的壓縮算法 {"zip":"def"} 采用默認(rèn)的壓縮算法
jku 包含公鑰的JWK Set的URL鏈接 {"jku":""} 密鑰集合采用的地址為:https://server.example.com/keys.jwks
jwk JWK的具體內(nèi)容 {"jwk":"..."} 密鑰采用的具體JWK值
kid JWK Set中指定的kid {"kid":"rsa"} JWK Set中采用id為“rsa”的JWK

另外還有更多的header字段登舞,參看:http://self-issued.info/docs/draft-ietf-jose-json-web-encryption.html#Header

3.1.2 JSON 格式

采用標(biāo)準(zhǔn)的JSON進(jìn)行目標(biāo)數(shù)據(jù)序列化

字段

字段名 描述 數(shù)據(jù)格式 是否密文
protected JWE Protected Header數(shù)據(jù) Base64UrlEncode
unprotected JWE Shared Unprotected Header數(shù)據(jù) 字符串
header 字符串
encrypted_key 密鑰加密后數(shù)據(jù) Base64UrlEncode
iv 向量數(shù)據(jù) Base64UrlEncode
ciphertext 原始報(bào)文加密數(shù)據(jù) Base64UrlEncode
tag 認(rèn)證標(biāo)簽 Base64UrlEncode

json格式化

{
   "protected":"<integrity-protected header contents>",
   "unprotected":<non-integrity-protected header contents>,
   "header":<more non-integrity-protected header contents>,
   "encrypted_key":"<encrypted key contents>",
   "aad":"<additional authenticated data contents>",
   "iv":"<initialization vector contents>",
   "ciphertext":"<ciphertext contents>",
   "tag":"<authentication tag contents>"
}

樣例

{
    "protected": "eyJlbmMiOiJBMTI4Q0JDLUhTMjU2In0",
    "unprotected": {
        "jku": "https://server.example.com/keys.jwks"
    },
    "header": {
        "alg": "A128KW",
        "kid": "7"
    },
    "encrypted_key": "6KB707dM9YTIgHtLvtgWQ8mKwboJW3of9locizkDTHzBC2IlrT1oOQ",
    "iv": "AxY8DCtDaGlsbGljb3RoZQ",
    "ciphertext": "KDlTtXchhZTGufMYmOYGS4HffxPSUrfmqCHXaI9wOGY",
    "tag": "Mz-VPPyU4RlcuYv1IwIvzw"
}

3.1.3 壓縮格式

壓縮格式把數(shù)據(jù)進(jìn)行BASE64UrlEncode贰逾,完了通過(guò)"."拼接每段數(shù)據(jù)結(jié)構(gòu)。

序列化格式
BASE64URL(UTF8(JWE Protected Header)) || '.' ||
BASE64URL(JWE Encrypted Key) || '.' ||
BASE64URL(JWE Initialization Vector) || '.' ||
BASE64URL(JWE Ciphertext) || '.' ||
BASE64URL(JWE Authentication Tag)
樣例
  eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ.
  OKOawDo13gRp2ojaHV7LFpZcgV7T6DVZKTyKOMTYUmKoTCVJRgckCL9kiMT03JGe
  ipsEdY3mx_etLbbWSrFr05kLzcSr4qKAq7YN7e9jwQRb23nfa6c9d-StnImGyFDb
  Sv04uVuxIp5Zms1gNxKKK2Da14B8S4rzVRltdYwam_lDp5XnZAYpQdb76FdIKLaV
  mqgfwX7XWRxv2322i-vDxRfqNzo_tETKzpVLzfiwQyeyPGLBIO56YJ7eObdv0je8
  1860ppamavo35UgoRdbYaBcoh9QcfylQr66oc6vFWXRcZ_ZT2LawVCWTIy3brGPi
  6UklfCpIMfIjf7iGdXKHzg.
  48V1_ALb6US04U3b.
  5eym8TW_c8SuK0ltJ3rpYIzOeDQz7TALvtu6UG9oMo4vpzs9tX_EFShS8iB7j6ji
  SdiwkIr3ajwQzaBtQD_A.
  XFBoMYUZodetZdvTiFvSkQ

3.1.4 序列化對(duì)比

序列化方式 簡(jiǎn)潔性 參數(shù)化(整體化) 安全性
JSON格式 ?? ? ?
壓縮格式 ? ?? ??

說(shuō)明:

參數(shù)化是只把整個(gè)結(jié)果當(dāng)做某個(gè)參數(shù)菠秒,比如在HTTP/GET中當(dāng)做參數(shù)疙剑。

總結(jié):

應(yīng)用過(guò)程中,推薦使用壓縮格式(JWE Compact Serialization)践叠。

3.2 JWE過(guò)程

3.2.1 標(biāo)準(zhǔn)過(guò)程

從上面的JWE的輸出結(jié)果言缤,我們可以看出JWE大致需要,生成密鑰禁灼、加密密鑰管挟、加密原始報(bào)文、數(shù)字認(rèn)證等過(guò)程弄捕。我們來(lái)看看一個(gè)標(biāo)準(zhǔn)的JWE過(guò)程是怎樣的:

step 1. 明確算法僻孝,生成JWE Header

step 2. 隨機(jī)生成密鑰

step 3. 加密密鑰,并且Base64UrlEncode守谓,生成JWE Encrypted Key

step 4. 隨機(jī)生成向量穿铆,并且Base64UrlEncode,生成 JWE Initialization Vector

step 5. 加密原始報(bào)文斋荞,并且Base64UrlEncode荞雏,生成 JWE Ciphertext

step 6. 生成認(rèn)證算法生成AAD

step 7. 截?cái)郃AD,獲取Authentication Tag,并且Base64UrlEncode凤优,生成JWE Authentication Tag

step 8. 序列化以上生成的5部分?jǐn)?shù)據(jù)羡疗,導(dǎo)出JWE Serialization數(shù)據(jù)

圖示如下:


3.3.2 示例

根據(jù)標(biāo)準(zhǔn)流程,我們使用一個(gè)一個(gè)AES+RSA+HMAC的例子來(lái)具體看JWE的示例過(guò)程

圖示:

說(shuō)明:

step 2.生成密鑰别洪,這個(gè)過(guò)程可以分2次隨機(jī)叨恨,每次生成128bit,再拼接挖垛。

step 6.AAD數(shù)據(jù)可以不用傳輸痒钝,最關(guān)鍵的數(shù)據(jù)為step7生成的Authenticcation Tag。

3.3 JWE本質(zhì)

通過(guò)上面的了解痢毒,我們可以簡(jiǎn)單總結(jié)下:

Feature 1. JWE并非某種特定的加密算法送矩,是一套加密的協(xié)議

JWE可以根據(jù)需要,靈活結(jié)合各種加密算法哪替。

Feature 2. JWE約束了加密流程步驟

** **JWE約束了基本的加密流程栋荸, 必須實(shí)現(xiàn)原始報(bào)文加密、密鑰加密凭舶、數(shù)字認(rèn)證等安全過(guò)程晌块。

Feature 3. JWE約束了輸出數(shù)據(jù)格式,有固定數(shù)據(jù)結(jié)構(gòu)

JWE有固定的數(shù)據(jù)結(jié)構(gòu)帅霜,2種學(xué)序列化格式都有嚴(yán)格的格式匆背。

(四) 基于JWE的API加密方案

4.基于JWE的數(shù)據(jù)安全方案

4.1方案原型

回顧2.1-2.5的方案,我們來(lái)看看JWE的方案原型:


推薦做法

在JWE的過(guò)程中身冀,基于安全考慮钝尸,密鑰的的加密算法通常使用非對(duì)稱加密算法,內(nèi)容的加密用對(duì)稱加密算法搂根。改進(jìn)后的原型如下:

4.2 算法選擇

JWE的過(guò)程中珍促,需要三次加密過(guò)程,通常的做法是

加密過(guò)程 算法 舉例
原始報(bào)文加密 對(duì)稱算法 AES128剩愧、AES256
密鑰加密 非對(duì)稱算法 RSA猪叙、ECC
認(rèn)證碼生成 HMAC HMAC-MD5、HMAC-SHA1隙咸、HMAC-SHA256沐悦、HMAC-SHA384

4.3 特性

性質(zhì) 描述
安全性 2次加密過(guò)程保證
真實(shí)性 通過(guò)數(shù)字認(rèn)證機(jī)制保證
不可抵抗性(雙向認(rèn)證) 通過(guò)非對(duì)稱加密算法進(jìn)行驗(yàn)證
動(dòng)態(tài)密鑰交換 對(duì)稱算法的密鑰每次都隨機(jī)生成
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市五督,隨后出現(xiàn)的幾起案子藏否,更是在濱河造成了極大的恐慌,老刑警劉巖充包,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件副签,死亡現(xiàn)場(chǎng)離奇詭異遥椿,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)淆储,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)冠场,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人本砰,你說(shuō)我怎么就攤上這事碴裙。” “怎么了点额?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵舔株,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我还棱,道長(zhǎng)载慈,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任珍手,我火速辦了婚禮办铡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘琳要。我一直安慰自己寡具,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布焙蹭。 她就那樣靜靜地躺著晒杈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪孔厉。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,737評(píng)論 1 305
  • 那天帖努,我揣著相機(jī)與錄音撰豺,去河邊找鬼。 笑死拼余,一個(gè)胖子當(dāng)著我的面吹牛污桦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播匙监,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼凡橱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了亭姥?” 一聲冷哼從身側(cè)響起稼钩,我...
    開(kāi)封第一講書(shū)人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎达罗,沒(méi)想到半個(gè)月后坝撑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體静秆,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年巡李,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抚笔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡侨拦,死狀恐怖殊橙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情狱从,我是刑警寧澤膨蛮,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站矫夯,受9級(jí)特大地震影響鸽疾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜训貌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一制肮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧递沪,春花似錦豺鼻、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至檩奠,卻和暖如春桩了,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背埠戳。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工井誉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人整胃。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓颗圣,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親屁使。 傳聞我的和親對(duì)象是個(gè)殘疾皇子在岂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

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