歡迎光臨
每天分享高質量文章

從 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編碼

 

先看一段代碼:

 

 

需要註意的是,BASE64Encoder和BASE64Decoder並不是官方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,加密演算法的水太深了,歡迎大家拍磚指教,^_^

赞(0)

分享創造快樂