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

前言

在我們?nèi)粘5某绦蜷_(kāi)發(fā)中,或多或少會(huì)遇到一些加密/解密的場(chǎng)景,比如在一些接口調(diào)用的過(guò)程中,我們(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ù)語(yǔ):單向、對(duì)稱、非對(duì)稱

假設(shè)場(chǎng)景:client需要發(fā)送一段消息"hello world"給server

單向加密

所謂單向加密是指client將消息"hello world"加密的過(guò)程不需要server參與,即加密不依賴server;同時(shí),server將收到的消息解密成"hello world"的過(guò)程也不依賴client。?

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

對(duì)稱加密

client加密消息需要依賴server,雙方可以相互解密。

非對(duì)稱加密

client加密消息需要依賴server,但是雙方不能相互解密。

不可不知的Base64編碼

先看一段代碼:

需要注意的是,BASE64Encoder和BASE64Decoder并不是官方JDK實(shí)現(xiàn)類,如果需要使用,需要引入sun.misc包。

嚴(yán)格來(lái)說(shuō),BASE64并不是一種加密算法,而是一種編碼格式。說(shuō)白了,BASE64的作用是,將人肉眼可以識(shí)別的信息,轉(zhuǎn)換為不可以識(shí)別的數(shù)據(jù),并不是對(duì)數(shù)據(jù)進(jìn)行加密,只是給數(shù)據(jù)換了一身衣服而已。(騙的了你的眼睛,騙不了程序)

原數(shù)據(jù)越大,那么BASE64生成的結(jié)果就越大,這是需要額外注意的點(diǎn)。

BASE64的生成結(jié)果始終由64個(gè)字符來(lái)組成。

由于BASE64的編碼特性,在一些場(chǎng)景中有應(yīng)用,比如有些網(wǎng)站會(huì)把圖片的二進(jìn)制流編碼成BASE64傳遞給客戶端;比如有些郵件服務(wù)器會(huì)將郵件的附件直接編碼成BASE64連同郵件內(nèi)容一起發(fā)送;比如在URL中有中文需要傳遞,可以先將中文進(jìn)行BASE64編碼,來(lái)避免傳輸過(guò)程中的亂碼。

使用廣泛的MD5

MD5,即Message Digest,信息摘要算法第5版。比如在和微信支付、支付寶支付接口交互的過(guò)程中,你就可以選擇MD5算法來(lái)加密。

先來(lái)看一段代碼:

MD5

MD5破解?

如前文所說(shuō),MD5是一種不可逆的算法,但是為什么存在破解呢?其實(shí),所謂的破解,并不是真正的破解,只不過(guò)是大數(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è)“加鹽”的過(guò)程。

MD5的一些特性分析

第一,我們知道BASE64隨著原數(shù)據(jù)的增大而導(dǎo)致編碼后的結(jié)果長(zhǎng)度變大,而MD5結(jié)果的長(zhǎng)度值是固定的,就是32位。也就是MD5的壓縮性很好。

第二,從原數(shù)據(jù)計(jì)算出MD5是一個(gè)快速且容易的過(guò)程,不可逆。

第三,要找到2個(gè)不同的數(shù)據(jù),它們計(jì)算后的MD5一致,這是非常困難的。這是MD5的弱碰撞性,也即是說(shuō)想要偽造數(shù)據(jù)太困難了。

第四,對(duì)原數(shù)據(jù)的任何修改,哪怕只改動(dòng)一個(gè)字節(jié)數(shù)據(jù),也會(huì)導(dǎo)致MD5值發(fā)生很大變化,說(shuō)明MD5的抗修改性非常好,非常適合密碼、業(yè)務(wù)數(shù)據(jù)校驗(yàn)、文件比對(duì)等。

了解SHA

SHA,即Security Hash Algorithm,安全散列算法,比如,我們的程序開(kāi)發(fā)完畢,我們發(fā)布的時(shí)候,想指定的人才可以使用,該怎么辦呢?這個(gè)時(shí)候就可以考慮使用SHA算法。SHA是公認(rèn)的比MD5更加安全的加密算法,在數(shù)字簽名領(lǐng)域應(yīng)用廣泛。

好了,到這里,初步介紹了下和咱們JAVA程序員有關(guān)的一些加密的知識(shí),重點(diǎn)介紹了BASE64和MD5,加密算法的水太深了,歡迎大家拍磚指教,^_^

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 在我們?nèi)粘5某绦蜷_(kāi)發(fā)中,或多或少會(huì)遇到一些加密/解密的場(chǎng)景,比如在一些接口調(diào)用的過(guò)程中,我們(Client)...
    測(cè)試大頭兵閱讀 195評(píng)論 0 0
  • 前言 在我們?nèi)粘5某绦蜷_(kāi)發(fā)中,或多或少會(huì)遇到一些加密/解密的場(chǎng)景,比如在一些接口調(diào)用的過(guò)程中,我們(Client)...
    張豐哲閱讀 2,528評(píng)論 11 46
  • 這篇文章主要講述在Mobile BI(移動(dòng)商務(wù)智能)開(kāi)發(fā)過(guò)程中,在網(wǎng)絡(luò)通信、數(shù)據(jù)存儲(chǔ)、登錄驗(yàn)證這幾個(gè)方面涉及的加密...
    雨_樹(shù)閱讀 3,018評(píng)論 0 6
  • 概述 之前一直對(duì)加密相關(guān)的算法知之甚少,只知道類似DES、RSA等加密算法能對(duì)數(shù)據(jù)傳輸進(jìn)行加密,且各種加密算法各有...
    Henryzhu閱讀 3,208評(píng)論 0 14
  • 農(nóng)村少年,隨著你慢慢的成長(zhǎng),你開(kāi)始向往著大城市的生活,如今又是你背起行囊背井離鄉(xiāng)的季節(jié)。 對(duì)于你而言,家僅僅只是回...
    軒凌閱讀 790評(píng)論 0 2

友情鏈接更多精彩內(nèi)容