前言
- 本文梳理主要基于書籍《Java加密與解密的藝術(shù)》煞烫、維基百科昼窗、百度百科以及網(wǎng)絡(luò)上眾多資料,如有涉及版權(quán)問題敷燎,請聯(lián)系我刪除相關(guān)內(nèi)容暂筝。
- 本篇內(nèi)容主要梳理了基本的摘要算法、對稱密碼加密算法硬贯、密鑰交換算法焕襟、非對稱加密算法、數(shù)字簽名算法等饭豹,我們?nèi)臻_發(fā)中涉及到加解密的一些解決方案都跟下文中提到的內(nèi)容相關(guān)鸵赖,尤其經(jīng)常跟第三方系統(tǒng)交互的時候,比如下文提到的微信支付平臺和螞蟻開放平臺上面接口的簽名認證方案拄衰,理解了這些算法概念它褪,對我們對接其它系統(tǒng)或自己設(shè)計接口的安全方案時都會有很大幫助,當然如果需要理解每一個算法的原理翘悉,數(shù)學公式茫打、推理等更深層次的內(nèi)容,建議去查看相關(guān)RFC文檔或其它網(wǎng)絡(luò)資料。
1.定義
密碼學是研究編制密碼和破譯密碼的技術(shù)科學老赤。
2.歷史
密碼學的歷史最早可以追溯到幾千年以前饼煞,古今中外都有密碼學運用的記載,從歷史看诗越,戰(zhàn)爭很大程度給密碼學提供了應(yīng)用環(huán)境,推動了密碼學的發(fā)展息堂,密碼學按照發(fā)展歷程嚷狞,大體可以分為三個階段,手工加密荣堰、機械加密和計算機加密階段床未,下面是近代密碼學的一些重要進展。
1949年振坚,信息論始祖克勞德·艾爾伍德·香農(nóng)(Claude Elwood Shannon)發(fā)表了《保密系統(tǒng)的通信理論》一文薇搁,把密碼學建立在嚴格的數(shù)學基礎(chǔ)之上,奠定理論基礎(chǔ)渡八,從此成為真正的科學啃洋。
1976年,密碼學專家惠特菲爾德·迪菲(Bailey Whitfield Diffie)和馬丁·赫爾曼(Martin Edward Hellman)兩人發(fā)表了《密碼學的新方向》一文屎鳍,解決了密鑰管理的難題宏娄,把密鑰分為加密的公鑰和解密的私鑰,提出了密鑰交換算法Diffie-Hellman逮壁。
1977年孵坚,美國國家標準技術(shù)研究所制定數(shù)據(jù)加密標準(Data Encryption Standard ),將其頒布為國家標準。
1977年窥淆,麻省理工學院的羅納德·李維斯特(Ron Rivest)卖宠、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出RSA加密算法,RSA就是他們?nèi)诵帐祥_頭字母拼在一起組成的忧饭。
1997年4月扛伍,美國ANSI發(fā)起征集AES(advanced encryption standard)的活動,并為此成立了AES工作小組眷昆,經(jīng)過幾年的時間篩選蜒秤,最終采用了由比利時的Joan Daemen和Vincent Rijmen設(shè)計的Rijndael算法,并在2002年5月26日成為有效的加密標準亚斋。
3.密碼學分類
按密碼體制劃分:對稱密碼體制密碼學和非對稱密碼體制密碼學對應(yīng)的有對稱密碼算法和非對稱密碼算法作媚。
- 對稱密碼算法(Symmetric Cipher):單鑰密碼算法或私鑰密碼算法,常見的有DES帅刊、AES算法纸泡。
- 非對稱密碼算法(Asymmetric Ciper):又稱雙鑰密碼算法或公鑰密碼算法,常見的有RSA算法赖瞒。
4.算法介紹
4.1消息摘要算法
4.1.1 簡述
消息摘要算法又稱散列算法女揭,其核心在于散列函數(shù)的單向性蚤假,即通過散列函數(shù)可獲得對應(yīng)的散列值,但不可通過該散列值反推其原始信息吧兔,這是消息摘要算法的安全性的根本所在磷仰,我們通常使用該算法判斷數(shù)據(jù)的完整性。
- 簡單的說:A 通過摘要算法計算得到B境蔼, B不能反推出A灶平,且不存在C摘要算法計算也得到B。
4.1.2 詳細介紹
消息摘要算法我們常見比如MD(Message Digest)箍土、SHA(Secure Hash Algorithm)逢享、HMAC(Hash Message Authentication Code)等,常用于驗證數(shù)據(jù)的完整性吴藻,是數(shù)字簽名算法的核心算法瞒爬。
- MD系列:MD2、MD4沟堡、MD5
- SHA系列:SHA-1侧但、SHA-2系列算法(包含SHA-224、SHA-256航罗、SHA-384和SHA-512)
- HMAC系列:MAC算法綜合了上述兩種算法俊犯,主要包括HmacMD5、HmacSHA1伤哺、HmacSHA256燕侠、HmacSHA384、HmacSHA512
常用消息摘要算法比較:
| 算法 | 摘要長度
| :-------: |:-------------:|
| MD2 | 128 |
| MD4 | 128 |
| MD5 | 128 |
| SHA-1 | 160 |
| SHA-224 | 224 |
| SHA-256 | 256 |
| SHA-384 | 384 |
| SHA-512 | 512 |
| HmacMD2 | 128 |
| HmacMD4 | 128 |
| HmacMD5 | 128 |
| HmacSHA-1 | 160 |
| HmacSHA-224 | 224 |
| HmacSHA-256 | 256 |
| HmacSHA-384 | 384 |
| HmacSHA-512 | 512 |
- MD系列算法長度是固定的128位立莉,目前已經(jīng)不安全绢彤,不建議使用在安全要求高的場景。
- MD蜓耻、SHA系列算法可以通過加鹽的方式提高安全性茫舶,比如MD5(message) 加鹽后變成MD5(message+salt),至于salt可以是隨機值,也可以是固定值刹淌,這樣攻擊者如果要根據(jù)摘要值反推原始值難度會大大加大饶氏。
- HMAC系列算法長度跟使用的摘要算法一樣,比如HmacSHA-256 有勾,因為SHA-256的摘要長度是256疹启,對應(yīng)的HmacSHA-256摘要長度也是256,HMAC算法跟MD蔼卡,SHA算法最大的差別增加了一個密鑰喊崖,這里的密鑰我理解是跟前面說的salt類似,只是HMAC把salt融入到算法里面,更加標準化和安全荤懂。
4.1.3 應(yīng)用場景
我們以微信支付的接口調(diào)用分析一下摘要算法怎么應(yīng)用的茁裙,首先可以打開微信支付如下相關(guān)文檔:
微信支付統(tǒng)一下單接口文檔
微信支付簽名過程
-
微信支付統(tǒng)一下單接口請求參數(shù)有兩個字段,簽名值和簽名類型节仿,其中簽名類型算法有HMAC-SHA256和MD5
- 生成簽名值過程
- 首先按照一定的規(guī)則組裝待計算摘要的數(shù)據(jù)stringA
- stringSignTemp=stringA+“&key=xxxxx”,這里其實就是加鹽晤锥,把在微信支付平臺設(shè)置的秘鑰key作為salt
- 使用MD5加密MD5(stringSignTemp),或者使用hash_hmac("sha256",stringSignTemp,key)廊宪,這里設(shè)置HMAC算法使用的key就是微信支付平臺設(shè)置的key查近。
這樣做的好處是怎么呢?我的理解大概有這么幾點:
更安全:通過引入這樣一個簽名值挤忙,即使攻擊者拿到了這個數(shù)據(jù),它如果修改請求參數(shù)值谈喳,比如把金額修改册烈,因為沒有這個key,攻擊者無法重新生成一個正確的摘要值婿禽,接收請求方計算摘要值比對后不匹配赏僧,直接拒絕請求就行了。
驗證身份:因為涉及兩個系統(tǒng)交互扭倾,怎樣證明對方的身份淀零?這里沒有用戶登錄,沒有token膛壹,而是依賴摘要值比對驾中,摘要一致就可以確定是合法的,所以我們的key保護也很重要模聋,不能泄露肩民。
4.2 對稱加密算法
4.2.1 簡述
對稱加密簡單的說就是加密和解密使用同一個密鑰,解密算法是加密算法的逆運算链方。
4.2.2 算法介紹
對稱加密算法主要有DES持痰、DES算法的變種DESede、DES替代者AES算法祟蚀、IDEA工窍、PBE等
- DES:1973年,美國國家標準局征求國家密碼標準標準方案前酿,IBM公司提交了自己的算法(Luciffer算法患雏,1971年末提出),1977年7月15日罢维,該算法被正式采納纵苛,后面成為數(shù)據(jù)加密標準(Data Encryption Standard ,DES),但是DES算法秘鑰偏短只有56位,且算法半公開攻人,被懷疑存在美國安全局安置的后門取试,由于現(xiàn)在已經(jīng)很容易破解DES算法,不推薦使用怀吻,但是作為對稱加密算法中的經(jīng)典算法瞬浓,是值得去了解和學習的夭咬。
- DESede:DES算法的一種改良邻辉,針對DES算法的密鑰長度偏短和迭代次數(shù)偏少等問題做了改進,密鑰長度增至112位或168位残邀,抗窮舉法攻擊的能力顯著增強屑咳。
- AES:1997年萨赁,NIST發(fā)起了征集DES替代算法-AES(Advanced Encryption Standard,高級數(shù)據(jù)加密標準),經(jīng)過多次篩選后兆龙,最終比利時人Joan Daemen和Vincent Rijmen設(shè)計的Rijndael算法被采用杖爽。
- IDEA:IDEA(International Data Encryption Algorithm,國際數(shù)據(jù)加密標準)算法是由旅居瑞士的中國青年學者來學嘉和著名密碼專家James Massey于1990提出的一種對稱分組密碼,并于1992年修改完成紫皇,算法使用長度為128位的密鑰慰安,數(shù)據(jù)塊大小為64位。
算法 | 密鑰長度 | 密鑰長度默認值 |
---|---|---|
DES | 56,64 | 56 |
DESede | 112聪铺、168化焕、128、192 | 168 |
AES | 128铃剔、192撒桨、256 | 128 |
IDEA | 128 | 128 |
4.3 非對稱加密算法
4.3.1 簡述
非對稱加密算法稱為雙鑰或公鑰加密算法,跟對稱加密算法不同的是键兜,對稱加密算法只一個密鑰元莫,非對稱加密算法 一個公鑰和一個私鑰,一個用于加密蝶押,另外一個用于解密踱蠢。
簡單的說:一對密鑰公鑰A和私鑰B,A加密只能B解密棋电,B加密只能A解密茎截。
4.3.2 算法介紹
非對稱加密算法源于DH算法(Diffie-Hellman,密鑰交換算法)由W.Diffie和 M.Hellman共同提出,該算法為非對稱加密算法奠定了基礎(chǔ),下面我們先來了解下密鑰交換算法DH和ECDH算法赶盔。
為什么需要密鑰交換算法企锌?前面我們提到對稱加密算法加解密都是用同一個密鑰,我們可以想一下于未,我們怎樣能安全的把一個密鑰給到對方呢撕攒?比如我們經(jīng)常用到HTTPS陡鹃,大家都說HTTPS加密了是安全的,那它加密的密鑰怎么來的呢抖坪?很顯然我們在訪問一個https地址的時候萍鲸,事先并沒有密鑰,訪問過程中客戶端跟服務(wù)端通過握手協(xié)議協(xié)商出來的密鑰擦俐,如果服務(wù)端直接把密鑰在網(wǎng)絡(luò)上傳輸那肯定不安全的脊阴,所以這過程到底發(fā)生了什么?后面專門分析https的時候會詳細寫蚯瞧,這里先了解下該算法嘿期。
DH密鑰交換算法的安全性基于有限域上的離散對數(shù)難題
ECDH密鑰交換算法是基于橢圓曲線加密
從上面圖中可以看出,DH&ECDH密鑰交換算法交互雙方都會向?qū)Ψ焦_一部分信息埋合,即所謂的公鑰备徐,這部分即使被別人拿到了也不會威脅到最終的密鑰,這里很關(guān)鍵的一點是甲乙兩方公布的公鑰是不相同的甚颂,但是最終生成的密鑰兩邊是一致的蜜猾,這里是利用的算法原理,有興趣的可以去查閱詳細的算法公式西设,因為最終的密鑰不需要傳輸給對方,所以很大程度保證安全性答朋。
非對稱加密算法:
比較典型的非對稱加密算法有RSA贷揽、ECC、ElGamal,RSA算法基于大數(shù)因子分解難題梦碗,而ElGamal和ECC算法則是基于離散對數(shù)難題禽绪。
- RSA:1977年,麻省理工學院的Ron Rivest洪规、Adi Shamir印屁、Leonard Adleman一起提出RSA加密算法,RSA就是他們?nèi)诵帐祥_頭字母拼在一起組成的斩例。
- EIGamal:1985年雄人,Taher EIGamal提出了一種基于離散對數(shù)問題的非對稱加密算法,該算法即可用于加密念赶,又可用于數(shù)字簽名础钠,美國數(shù)字簽名標準(Digital Signature Standard ,DSS)就是采用了EIGamal簽名方案的一種變形-DSA(Digital Signature Algorithm)。
- ECC:橢圓加密算法(ECC)是一種公鑰加密體制叉谜,最初由Koblitz和Miller兩人于1985年提出旗吁,其數(shù)學基礎(chǔ)是利用橢圓曲線上的有理點構(gòu)成Abel加法群上橢圓離散對數(shù)的計算困難性。
從上面消息傳遞模型我們可以看出停局,非對稱加密算法遵循“私鑰加密很钓,公鑰解密”和“公鑰加密香府,私鑰解密”的原則,但是有一點需要注意码倦,公鑰是公開的企孩,所以用在什么場景是需要根據(jù)該算法的特征來考慮的,比如既然公鑰是公開的叹洲,你用私鑰加密敏感數(shù)據(jù)傳遞給第三方合適么柠硕?顯然不合適,因為公鑰公開的运提,別人都可以拿到公鑰蝗柔,也就意味著你加密的數(shù)據(jù)都可以解密,所以適合的場景比如私鑰加密民泵,公鑰只是用來驗證加密的內(nèi)容癣丧,每個人都可以來驗證,該場景是不在乎加密內(nèi)容被其它攻擊者看到的栈妆,甚至說內(nèi)容本來就是公開的胁编,對于接收者用公鑰確保內(nèi)容沒有被篡改即可,所以我們通常說非對稱算法“私鑰簽名鳞尔,公鑰驗證簽名”嬉橙,另外一點,“公鑰加密寥假,私鑰解密”市框,因為私鑰只有我們自己手上有,所以理論上也只有我們自己可以解密糕韧,這樣是安全的枫振,https證書驗證以及握手協(xié)議過程中會體現(xiàn)這一點。
4.4 數(shù)字簽名算法
4.4.1 簡述
數(shù)字簽名算法可以看做是一種帶有密鑰的消息摘要算法萤彩,并且這種密鑰包含了公鑰和私鑰粪滤。也就是說數(shù)字簽名算法是非對稱加密算法和消息摘要算法的結(jié)合體,遵循“私鑰簽名雀扶,公鑰驗證”的簽名認證方式杖小。
數(shù)字簽名算法是公鑰基礎(chǔ)設(shè)施(Public Key Infrastructure,PKI)以及許多網(wǎng)絡(luò)安全機制(SSL/TLS,VPN等)的基礎(chǔ)。
數(shù)字簽名算法要求能夠驗證數(shù)據(jù)完整性愚墓、認證數(shù)據(jù)來源窍侧,并起到抗否認的作用。
4.4.2 算法介紹
數(shù)字簽名算法主要包括RSA转绷、DSA伟件、ECDSA共3種算法,其中RSA算法源于整數(shù)因子分解問題议经,DSA和ECDSA算法源于離散對數(shù)問題斧账。
- RSA:典型的非對稱加密算法谴返,結(jié)合摘要算法可形成對應(yīng)的簽名算法,如結(jié)合MD5或者SHA 等摘要算法
- DSA:繼RSA算法后出現(xiàn)的基于DSS的數(shù)字簽名算法咧织,旨在形成數(shù)字簽名標準嗓袱,為后續(xù)數(shù)字簽名算法的形成奠定基礎(chǔ)
-
ECDSA:橢圓曲線加密算法ECC與DSA算法的結(jié)合,相對于傳統(tǒng)簽名算法习绢,具有速度快渠抹、強度高、簽名短等優(yōu)點闪萄,其用途也越來越廣泛梧却。
數(shù)字簽名的算法傳遞模型:
- 甲方使用非對稱加密算法構(gòu)建密鑰對。
- 甲方公布甲方公鑰
- 使用私鑰對數(shù)據(jù)簽名败去,這里一般是結(jié)合摘要算法放航,比如摘要算法對數(shù)據(jù)進行摘要計算,私鑰對摘要值加密圆裕。
- 發(fā)送簽名值以及數(shù)據(jù)广鳍。
- 使用公鑰對簽名進行驗證,這里一般是公鑰對簽名數(shù)據(jù)解密出來得到摘要值吓妆,對數(shù)據(jù)進行摘要計算赊时,然后比對摘要值是否一致。
4.4.3 應(yīng)用場景
我們以螞蟻金服開放平臺上接口簽名方案為例行拢,詳細說明可以打開如下文檔:
螞蟻開放平臺簽名專區(qū)
- 跟前面微信支付平臺上的方案不一樣祖秒,微信支付采用的HMAC,通過摘要計算過程中的密鑰以及摘要值比對確定合法性剂陡,螞蟻金服采用的RSA和SHA狈涮,具體如下:
- 生成RSA密鑰狐胎。
- 上傳公鑰到平臺并獲取支付寶公鑰鸭栖。
- 使用私鑰對請求簽名。
- 使用支付寶公鑰對請求驗證簽名握巢。
-
螞蟻開放平臺支持的簽名算法晕鹊,建議使用RSA2,安全性更高暴浦。
- 從上面我們可以看出溅话,螞蟻開放平臺接口簽名就是采用的非對稱加密算法RSA和摘要算法SHA1和SHA256,第三方發(fā)給支付寶的請求采用自己的私鑰簽名歌焦,螞蟻平臺用你上傳的公鑰對我們的請求進行簽名認證飞几,同樣的我們收到的螞蟻平臺的請求,我們用支付寶公鑰進行簽名認證独撇,這跟我們前面提到的數(shù)字簽名傳遞模型是符合的屑墨。