從Java程序員的角度理解加密的那些事

前言

在咱們平常的程序開發中,或多或少會遇到一些加密/解密的場景,好比在一些接口調用的過程當中,咱們(Client)不單單須要傳遞給接口服務(Server)必要的業務參數,還得提供Signature(數字簽名)以供Server端進行校驗(是不是非法請求?是否有篡改?);Server端進行處理後返回給Client的響應結果中還會包含Signature,以供校驗。本篇博客將從Java程序員的角度出發,通俗理解加密、解密的那些事!程序員


理解一些術語:單向、對稱、非對稱

假設場景:client須要發送一段消息"hello world"給server算法

單向加密安全

所謂單向加密是指client將消息"hello world"加密的過程不須要server參與,即加密不依賴server;同時,server將受到的消息解密成"hello world"的過程也不依賴client。服務器

例如,我們知道的MD5就是一種單向加密算法,是一種不可逆的算法。微信

對稱加密測試

client加密消息須要依賴server,雙方能夠相互解密。大數據

非對稱加密微信支付

client加密消息須要依賴server,可是雙方不能相互解密。網站


不可不知的Base64編碼

先看一段代碼:編碼

BASE64編碼/解碼測試

須要注意的是,BASE64EncoderBASE64Decoder並非官方JDK實現類,若是須要使用,須要引入sun.misc包。

嚴格來講,BASE64並非一種加密算法,而是一種編碼格式。說白了,BASE64的做用是,將人肉眼能夠識別的信息,轉換爲不能夠識別的數據,並非對數據進行加密,只是給數據換了一身衣服而已。(騙的了你的眼睛,騙不了程序)

原數據越大,那麼BASE64生成的結果就越大,這是須要額外注意的點。

BASE64的生成結果始終由64個字符來組成。

因爲BASE64的編碼特性,在一些場景中有應用,好比有些網站會把圖片的二進制流編碼成BASE64傳遞給客戶端;好比有些郵件服務器會將郵件的附件直接編碼成BASE64連同郵件內容一塊兒發送;好比在URL中有中文須要傳遞,能夠先將中文進行BASE64編碼,來避免傳輸過程當中的亂碼。


使用普遍的MD5

MD5,即Message Digest,信息摘要算法第5版。好比在和微信支付、支付寶支付接口交互的過程當中,你就能夠選擇MD5算法來加密。

先來看一段代碼:

MD5

MD5破解?

如前文所說,MD5是一種不可逆的算法,可是爲何存在破解呢?其實,所謂的破解,並非真正的破解,只不過是大數據查詢的一個碰撞而已。好比,有一臺服務器存儲了大量key以及key的MD5編碼的信息,那麼就能夠拿着數據去進行比對。

那麼實際場景中,通常咱們如何防止這種暴力破解呢?

答案:進行二次加密。

好比client在調用server接口的時候,server分配給client一個Token,每次client調用server接口的時候,須要對Token以及業務參數一塊兒進行MD5加密。其實這就是所謂的一個「加鹽」的過程。

MD5的一些特性分析

第一,咱們知道BASE64隨着原數據的增大而致使編碼後的結果長度變大,而MD5結果的長度值是固定的,就是32位。也就是MD5的壓縮性很好。

第二,從原數據計算出MD5是一個快速且容易的過程,不可逆。

第三,要找到2個不一樣的數據,它們計算後的MD5一致,這是很是困難的。這是MD5的弱碰撞性,也便是說想要僞造數據太困難了。

第四,對原數據的任何修改,哪怕只改動一個字節數據,也會致使MD5值發生很大變化,說明MD5的抗修改性很是好,很是適合密碼、業務數據校驗、文件比對等。


瞭解SHA

SHA,即Security Hash Algorithm,安全散列算法,好比,咱們的程序開發完畢,咱們發佈的時候,想指定的人才可使用,該怎麼辦呢?這個時候就能夠考慮使用SHA算法。SHA是公認的比MD5更加安全的加密算法,在數字簽名領域應用普遍。


好了,到這裏,初步介紹了下和我們JAVA程序員有關的一些加密的知識,重點介紹了BASE64和MD5,加密算法的水太深了,歡迎你們拍磚指教,^_^

相關文章
相關標籤/搜索