為什么我們需要加密
系統(tǒng)開發(fā)中,對數(shù)據(jù)的加密是不可缺少的,例如登錄時對用戶的密碼加密策略,雖然目前https協(xié)議得到了很大的推廣,但還是有少部分使用http協(xié)議的網(wǎng)站,如果再次使用明文傳輸數(shù)據(jù),那就非常危險了。
比如登錄策略,發(fā)起登錄時一般是訪問登錄接口,將賬號,密碼傳輸過去。比如這樣
使用瀏覽器自帶的抓包工具,可以看見,此時的密碼就是明文的,沒有經(jīng)過加密。如果這個網(wǎng)站是http協(xié)議那就很危險了。
所以一般會選擇在登錄時前端對數(shù)據(jù)進行加密,傳輸?shù)胶蠖撕?,由后端解密,后端再去進行后續(xù)處理。比如這個網(wǎng)站,輸入賬號密碼登錄后,使用瀏覽器自帶的抓包工具就可以查看到,密碼經(jīng)過了加密處理。
盡管前端將數(shù)據(jù)傳輸給后端時經(jīng)過了加密,在數(shù)據(jù)庫中的密碼依然需要加密。防止數(shù)據(jù)庫被竊取,泄露用戶隱私,造成財產(chǎn)安全的損失。
加密前
加密后
這樣一來,哪怕不小心發(fā)生數(shù)據(jù)庫信息泄露,也不容易將用戶密碼直接暴露出去。
常見加密策略
1.散列算法
散列是信息的提煉,通常其長度要比信息小得多,且為一個固定長度。加密性強的散列一定是不可逆的,這就意味著通過散列結(jié)果,無法推出任何部分的原始信息。
比如MD5算法。該加密算法很常用,但是隨著大數(shù)據(jù)時代,該算法也能被破解。
另一個算法BCrypt算法,是一種加鹽的加密算法,MD5算法一段密碼每次經(jīng)過hash后生成的值是一樣的,但是BCrypt加密算法可以使得一段密碼加密后,內(nèi)容不唯一,可調(diào)用相關(guān)函數(shù)進行與數(shù)據(jù)庫存放的密文進行匹配。
2.對稱加密
需要對加密和解密使用相同密鑰的加密算法。由于其速度快,對稱性加密通常在消息發(fā)送方需要加密大量數(shù)據(jù)時使用。對稱性加密也稱為密鑰加密。
因此加密的安全性不僅取決于加密算法本身,密鑰管理的安全性更是重要。因為加密和解密都使用同一個密鑰,如何把密鑰安全地傳遞到解密者手上就成了必須要解決的問題。
DES算法屬于對稱加密算法,明文按64位進行分組,密鑰長為64位,但事實上只有56位參與了DES運算(第8/16/24/32/40/48/56/64位是校驗位,使得每個密匙都有奇數(shù)個1),分組后的明文和56位的秘鑰按位替換或交換的方法形成密文。由于計算機運算能力的增強,原版DES密碼的秘鑰長度變得容易被暴力破解,因此演變出了3DES算法,3DES是DES向AES過渡的加密算法,它使用3條56位的密鑰對數(shù)據(jù)進行三次加密,是DES的一個更安全的變形。
AES全稱是Advanced Encryption Standard,即高級加密標準,該算法是美國聯(lián)邦政府采用的一種對稱加密標準,這個標準用來代替原先的DES算法,已經(jīng)廣為全世界所使用,已然成為對稱加密算法中最流行的算法之一。AES算法作為新一代的數(shù)據(jù)加密標準匯聚了強安全性、高性能、高效率、易用和靈活等優(yōu)點,設(shè)計有三個密鑰長度:128,192,256位,比DES算法的加密強度更高,更為安全。
3.非對稱加密
對稱加密算法在加密和解密時使用的是同一個秘鑰;而非對稱加密算法需要兩個密鑰來進行加密和解密,這兩個密鑰是公鑰和私鑰。
通常由前端第一次訪問后端獲取到公鑰,再通過公鑰對信息加密后再向后端傳輸數(shù)據(jù),后端獲取到數(shù)據(jù)后,再通過私鑰進行解密,從而實現(xiàn)密碼加密傳輸。
常用RSA算法
RSA非對稱加密算法是1997年由Ron Rivest、AdiShamirh和LenAdleman開發(fā)的,RSA取名來自開發(fā)他們?nèi)叩拿帧SA是目前最有影響力的非對稱加密算法,它能抵抗到目前為止已知的所有密碼攻擊,已被ISO推薦為公鑰數(shù)據(jù)加密標準。RSA算法基于一個十分簡單的數(shù)論事實:將兩個大素數(shù)相乘十分容易,但反過來想要對其乘積進行因式分解卻十分困難,因此可以將乘積公開作為加密秘鑰。
4.數(shù)字簽名
數(shù)字簽名(又稱公鑰數(shù)字簽名)是只有信息的發(fā)送者才能產(chǎn)生的別人無法偽造的一段數(shù)字串,這段數(shù)字串同時也是對信息的發(fā)送者發(fā)送信息真實性的一個有效證明。它是一種類似寫在紙上的普通的物理簽名,但是在使用了公鑰加密領(lǐng)域的技術(shù)來實現(xiàn)的,用于鑒別數(shù)字信息的方法。一套數(shù)字簽名通常定義兩種互補的運算,一個用于簽名,另一個用于驗證。數(shù)字簽名是非對稱密鑰加密技術(shù)與數(shù)字摘要技術(shù)的應(yīng)用。
以上加密算法只是簡單的介紹,具體使用方式可以去查詢相關(guān)技術(shù)文檔以使用。
參考文章
JAVA開發(fā)必須掌握的5中加密策略
https://blog.csdn.net/huang_yx/article/details/79752565
加密策略
https://blog.csdn.net/aipiannian6725/article/details/101157803
BCrypt加密的原理,以及常見的加密算法
https://blog.csdn.net/qq_41174684/article/details/90214341
對稱加密
https://blog.csdn.net/qq_44836294/article/details/108488941
對稱加密、非對稱加密、公鑰、私鑰究竟是個啥?
https://blog.csdn.net/albertsh/article/details/106536857