从Java程序员的角度理解加密的那些事
前言
在我們?nèi)粘5某绦蜷_發(fā)中,或多或少會遇到一些加密/解密的場景,比如在一些接口調(diào)用的過程中,我們(Client)不僅僅需要傳遞給接口服務(wù)(Server)必要的業(yè)務(wù)參數(shù),還得提供Signature(數(shù)字簽名)以供Server端進行校驗(是否是非法請求?是否有篡改?);Server端進行處理后返回給Client的響應(yīng)結(jié)果中還會包含Signature,以供校驗。本篇博客將從Java程序員的角度出發(fā),通俗理解加密、解密的那些事!
?
理解一些術(shù)語:單向、對稱、非對稱
假設(shè)場景:client需要發(fā)送一段消息"hello world"給server
單向加密
所謂單向加密是指client將消息"hello world"加密的過程不需要server參與,即加密不依賴server;同時,server將收到的消息解密成"hello world"的過程也不依賴client。
例如,咱們知道的MD5就是一種單向加密算法,是一種不可逆的算法。
對稱加密
client加密消息需要依賴server,雙方可以相互解密。
非對稱加密
client加密消息需要依賴server,但是雙方不能相互解密。
?
不可不知的Base64編碼
先看一段代碼:
BASE64編碼/解碼測試需要注意的是,BASE64Encoder和BASE64Decoder并不是官方JDK實現(xiàn)類,如果需要使用,需要引入sun.misc包。
嚴格來說,BASE64并不是一種加密算法,而是一種編碼格式。說白了,BASE64的作用是,將人肉眼可以識別的信息,轉(zhuǎn)換為不可以識別的數(shù)據(jù),并不是對數(shù)據(jù)進行加密,只是給數(shù)據(jù)換了一身衣服而已。(騙的了你的眼睛,騙不了程序)
原數(shù)據(jù)越大,那么BASE64生成的結(jié)果就越大,這是需要額外注意的點。
BASE64的生成結(jié)果始終由64個字符來組成。
由于BASE64的編碼特性,在一些場景中有應(yīng)用,比如有些網(wǎng)站會把圖片的二進制流編碼成BASE64傳遞給客戶端;比如有些郵件服務(wù)器會將郵件的附件直接編碼成BASE64連同郵件內(nèi)容一起發(fā)送;比如在URL中有中文需要傳遞,可以先將中文進行BASE64編碼,來避免傳輸過程中的亂碼。
?
使用廣泛的MD5
MD5,即Message Digest,信息摘要算法第5版。比如在和微信支付、支付寶支付接口交互的過程中,你就可以選擇MD5算法來加密。
先來看一段代碼:
MD5MD5破解?
如前文所說,MD5是一種不可逆的算法,但是為什么存在破解呢?其實,所謂的破解,并不是真正的破解,只不過是大數(shù)據(jù)查詢的一個碰撞而已。比如,有一臺服務(wù)器存儲了大量key以及key的MD5編碼的信息,那么就可以拿著數(shù)據(jù)去進行比對。
那么實際場景中,一般我們?nèi)绾畏乐惯@種暴力破解呢?
答案:進行二次加密。
比如client在調(diào)用server接口的時候,server分配給client一個Token,每次client調(diào)用server接口的時候,需要對Token以及業(yè)務(wù)參數(shù)一起進行MD5加密。其實這就是所謂的一個“加鹽”的過程。
MD5的一些特性分析
第一,我們知道BASE64隨著原數(shù)據(jù)的增大而導(dǎo)致編碼后的結(jié)果長度變大,而MD5結(jié)果的長度值是固定的,就是32位。也就是MD5的壓縮性很好。
第二,從原數(shù)據(jù)計算出MD5是一個快速且容易的過程,不可逆。
第三,要找到2個不同的數(shù)據(jù),它們計算后的MD5一致,這是非常困難的。這是MD5的弱碰撞性,也即是說想要偽造數(shù)據(jù)太困難了。
第四,對原數(shù)據(jù)的任何修改,哪怕只改動一個字節(jié)數(shù)據(jù),也會導(dǎo)致MD5值發(fā)生很大變化,說明MD5的抗修改性非常好,非常適合密碼、業(yè)務(wù)數(shù)據(jù)校驗、文件比對等。
?
了解SHA
SHA,即Security Hash Algorithm,安全散列算法,比如,我們的程序開發(fā)完畢,我們發(fā)布的時候,想指定的人才可以使用,該怎么辦呢?這個時候就可以考慮使用SHA算法。SHA是公認的比MD5更加安全的加密算法,在數(shù)字簽名領(lǐng)域應(yīng)用廣泛。
?
好了,到這里,初步介紹了下和咱們JAVA程序員有關(guān)的一些加密的知識,重點介紹了BASE64和MD5,加密算法的水太深了,歡迎大家拍磚指教,^_^
作者:張豐哲
鏈接:https://www.jianshu.com/p/7c665d5f734e
來源:簡書
簡書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處。
總結(jié)
以上是生活随笔為你收集整理的从Java程序员的角度理解加密的那些事的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kubernetes健康检查如何做?官方
- 下一篇: 手把手带你用数据库中间件Mycat+Sp