前言
在我們?nèi)粘5某绦蜷_發(fā)中偏瓤,或多或少會(huì)遇到一些加密/解密的場(chǎng)景狮杨,比如在一些接口調(diào)用的過程中豺妓,我們(Client)不僅僅需要傳遞給接口服務(wù)(Server)必要的業(yè)務(wù)參數(shù),還得提供Signature(數(shù)字簽名)以供Server端進(jìn)行校驗(yàn)(是否是非法請(qǐng)求锭环?是否有篡改聪全?);Server端進(jìn)行處理后返回給Client的響應(yīng)結(jié)果中還會(huì)包含Signature辅辩,以供校驗(yàn)。本篇博客將從Java程序員的角度出發(fā)娃圆,通俗理解加密玫锋、解密的那些事!
理解一些術(shù)語:單向讼呢、對(duì)稱撩鹿、非對(duì)稱
假設(shè)場(chǎng)景:client需要發(fā)送一段消息"hello world"給server
單向加密
所謂單向加密是指client將消息"hello world"加密的過程不需要server參與,即加密不依賴server悦屏;同時(shí)节沦,server將收到的消息解密成"hello world"的過程也不依賴client。?
?例如础爬,咱們知道的MD5就是一種單向加密算法甫贯,是一種不可逆的算法。
對(duì)稱加密
client加密消息需要依賴server看蚜,雙方可以相互解密叫搁。
非對(duì)稱加密
client加密消息需要依賴server,但是雙方不能相互解密供炎。
不可不知的Base64編碼
先看一段代碼:
需要注意的是渴逻,BASE64Encoder和BASE64Decoder并不是官方JDK實(shí)現(xiàn)類,如果需要使用音诫,需要引入sun.misc包惨奕。
嚴(yán)格來說,BASE64并不是一種加密算法竭钝,而是一種編碼格式梨撞。說白了,BASE64的作用是蜓氨,將人肉眼可以識(shí)別的信息聋袋,轉(zhuǎn)換為不可以識(shí)別的數(shù)據(jù),并不是對(duì)數(shù)據(jù)進(jìn)行加密穴吹,只是給數(shù)據(jù)換了一身衣服而已幽勒。(騙的了你的眼睛,騙不了程序)
原數(shù)據(jù)越大港令,那么BASE64生成的結(jié)果就越大啥容,這是需要額外注意的點(diǎn)锈颗。
BASE64的生成結(jié)果始終由64個(gè)字符來組成。
由于BASE64的編碼特性咪惠,在一些場(chǎng)景中有應(yīng)用击吱,比如有些網(wǎng)站會(huì)把圖片的二進(jìn)制流編碼成BASE64傳遞給客戶端;比如有些郵件服務(wù)器會(huì)將郵件的附件直接編碼成BASE64連同郵件內(nèi)容一起發(fā)送遥昧;比如在URL中有中文需要傳遞覆醇,可以先將中文進(jìn)行BASE64編碼,來避免傳輸過程中的亂碼炭臭。
使用廣泛的MD5
MD5永脓,即Message Digest,信息摘要算法第5版鞋仍。比如在和微信支付常摧、支付寶支付接口交互的過程中,你就可以選擇MD5算法來加密威创。
先來看一段代碼:
MD5
MD5破解落午?
如前文所說,MD5是一種不可逆的算法肚豺,但是為什么存在破解呢溃斋?其實(shí),所謂的破解详炬,并不是真正的破解盐类,只不過是大數(shù)據(jù)查詢的一個(gè)碰撞而已。比如呛谜,有一臺(tái)服務(wù)器存儲(chǔ)了大量key以及key的MD5編碼的信息在跳,那么就可以拿著數(shù)據(jù)去進(jìn)行比對(duì)。
那么實(shí)際場(chǎng)景中隐岛,一般我們?nèi)绾畏乐惯@種暴力破解呢猫妙?
答案:進(jìn)行二次加密。
比如client在調(diào)用server接口的時(shí)候聚凹,server分配給client一個(gè)Token割坠,每次client調(diào)用server接口的時(shí)候,需要對(duì)Token以及業(yè)務(wù)參數(shù)一起進(jìn)行MD5加密妒牙。其實(shí)這就是所謂的一個(gè)“加鹽”的過程彼哼。
MD5的一些特性分析
第一,我們知道BASE64隨著原數(shù)據(jù)的增大而導(dǎo)致編碼后的結(jié)果長(zhǎng)度變大湘今,而MD5結(jié)果的長(zhǎng)度值是固定的敢朱,就是32位。也就是MD5的壓縮性很好。
第二拴签,從原數(shù)據(jù)計(jì)算出MD5是一個(gè)快速且容易的過程孝常,不可逆。
第三蚓哩,要找到2個(gè)不同的數(shù)據(jù)构灸,它們計(jì)算后的MD5一致,這是非常困難的岸梨。這是MD5的弱碰撞性喜颁,也即是說想要偽造數(shù)據(jù)太困難了。
第四盛嘿,對(duì)原數(shù)據(jù)的任何修改洛巢,哪怕只改動(dòng)一個(gè)字節(jié)數(shù)據(jù),也會(huì)導(dǎo)致MD5值發(fā)生很大變化次兆,說明MD5的抗修改性非常好,非常適合密碼锹锰、業(yè)務(wù)數(shù)據(jù)校驗(yàn)芥炭、文件比對(duì)等。
了解SHA
SHA恃慧,即Security Hash Algorithm园蝠,安全散列算法,比如痢士,我們的程序開發(fā)完畢彪薛,我們發(fā)布的時(shí)候,想指定的人才可以使用怠蹂,該怎么辦呢善延?這個(gè)時(shí)候就可以考慮使用SHA算法。SHA是公認(rèn)的比MD5更加安全的加密算法城侧,在數(shù)字簽名領(lǐng)域應(yīng)用廣泛易遣。
好了,到這里嫌佑,初步介紹了下和咱們JAVA程序員有關(guān)的一些加密的知識(shí)豆茫,重點(diǎn)介紹了BASE64和MD5,加密算法的水太深了屋摇,歡迎大家拍磚指教揩魂,^_^