前言
在這個(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ú),密鑰暴露之后漱办,可以被任意偽造 |
缺陷
- 密鑰單一这刷,無(wú)法實(shí)現(xiàn)動(dòng)態(tài)密鑰管理
- 密鑰暴露之后,整套方案的安全性不攻自破
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) |
缺陷
- 密鑰單一畜挥,無(wú)法實(shí)現(xiàn)動(dòng)態(tài)密鑰管理
- 密鑰暴露之后,整套方案的安全性不攻自破
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è)交互流程:
此方式的特點(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ú)沙郭,密鑰暴露之后佛呻,可以被任意偽造 |
缺陷
- 密鑰單一,無(wú)法實(shí)現(xiàn)動(dòng)態(tài)密鑰管理
- 密鑰暴露之后病线,整套方案的安全性不攻自破
2.1.4 HTTP+非對(duì)稱加密
前面的方案都是基于非對(duì)稱加密算法吓著,統(tǒng)一的缺陷就是密鑰單一,無(wú)法實(shí)現(xiàn)動(dòng)態(tài)管理送挑,密鑰本身的安全性得到了很大的威脅绑莺。基于這個(gè)考慮让虐,提出了此方案紊撕。
如下圖所示,用HTTP+RSA舉例過(guò)程:
用非對(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) |
缺陷
- 性能低下笼才,速度慢
- 不適用于大數(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舉例:
從安全的層面,該方案已經(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ī)生成 |