加密算法我們整體可以分為:可逆加密和不可逆加密,可逆加密又可以分為:對稱加密和非對稱加密。
一、不可逆加密
常見的不可逆加密算法有MD5,HMAC,SHA1、SHA-224、SHA-256、SHA-384,和SHA-512,其中SHA-224、SHA-256、SHA-384,和SHA-512我們可以統稱為SHA2加密算法,SHA加密算法的安全性要比MD5更高,而SHA2加密算法比SHA1的要高。其中SHA后面的數字表示的是加密后的字符串長度,SHA1默認會產生一個160位的信息摘要。
不可逆加密算法最大的特點就是密鑰,但是HMAC是需要密鑰的【手動狗頭】。
由于這些加密都是不可逆的,因此比較常用的場景就是用戶密碼加密,其驗證過程就是通過比較兩個加密后的字符串是否一樣來確認身份的。網上也有很多自稱是可以破解MD5密碼的網站,其原理也是一樣,就是有一個巨大的資源庫,存放了許多字符串及對應的MD5加密后的字符串,通過你輸入的MD5加密串來進行比較,如果過你的密碼復雜度比較低,還是有很大機率驗證出來的。
1.1 MD5
MD5信息摘要算法(英語:MD5 Message-Digest Algorithm),一種被廣泛使用的密碼散列函數,可以產生出一個128位(16字節)的散列值(hash value),用于確保信息傳輸完整一致。
MD5算法有以下特點:
1、壓縮性:無論數據長度是多少,計算出來的MD5值長度相同
2、容易計算性:由原數據容易計算出MD5值
3、抗修改性:即便修改一個字節,計算出來的MD5值也會巨大差異
4、抗碰撞性:知道數據和MD5值,很小概率找到相同MD5值相同的原數據。
publicstaticStringmd5(Stringtext){MessageDigestmessageDigest=null;try{messageDigest=MessageDigest.getInstance("MD5");}catch(NoSuchAlgorithmExceptione){e.printStackTrace();}byte[]bytes=messageDigest.digest(text.getBytes());returnHex.encodeHexString(bytes);}
1.2 SHA系列
安全散列算法(英語:Secure Hash Algorithm,縮寫為SHA)是一個密碼散列函數家族,是FIPS所認證的安全散列算法。能計算出一個數字消息所對應到的,長度固定的字符串(又稱消息摘要)的算法。且若輸入的消息不同,它們對應到不同字符串的機率很高。
2005年8月17日的CRYPTO會議尾聲中王小云、姚期智、姚儲楓再度發表更有效率的SHA-1攻擊法,能在2的63次方個計算復雜度內找到碰撞。
也就是說SHA-1加密算法有碰撞的可能性,雖然很小。
publicstaticStringsha256(Stringtext){MessageDigestmessageDigest=null;try{messageDigest=MessageDigest.getInstance("SHA-256");}catch(NoSuchAlgorithmExceptione){e.printStackTrace();}byte[]bytes=messageDigest.digest(text.getBytes());returnHex.encodeHexString(bytes);}
1.3 HMAC系列
HMAC是密鑰相關的哈希運算消息認證碼(Hash-based Message Authentication Code)的縮寫,由H.Krawezyk,M.Bellare,R.Canetti于1996年提出的一種基于Hash函數和密鑰進行消息認證的方法,并于1997年作為RFC2104被公布,并在IPSec和其他網絡協議(如SSL)中得以廣泛應用,現在已經成為事實上的Internet安全標準。它可以與任何迭代散列函數捆綁使用。
HMAC算法更像是一種加密算法,它引入了密鑰,其安全性已經不完全依賴于所使用的Hash算法
publicstaticStringhmacSha256(Stringtext,SecretKeySpecsk){Macmac=null;try{mac=Mac.getInstance("HmacSHA256");}catch(NoSuchAlgorithmExceptione){e.printStackTrace();}try{mac.init(sk);}catch(InvalidKeyExceptione){e.printStackTrace();}byte[]rawHmac=mac.doFinal(text.getBytes());returnnewString(Base64.encodeBase64(rawHmac));
如果要使用不可逆加密,推薦使用SHA256、SHA384、SHA512以及HMAC-SHA256、HMAC-SHA384、HMAC-SHA512這幾種算法。
二、對稱加密算法
對稱加密算法是應用比較早的算法,在數據加密和解密的時用的都是同一個密鑰,這就造成了密鑰管理困難的問題。常見的對稱加密算法有DES、3DES、AES128、AES192、AES256 (默認安裝的 JDK 尚不支持 AES256,需要安裝對應的 jce 補丁進行升級 jce1.7,jce1.8)。其中AES后面的數字代表的是密鑰長度。對稱加密算法的安全性相對較低,比較適用的場景就是內網環境中的加解密。
2.1 DES
DES是對稱加密算法領域中的典型算法,其密鑰默認長度為56位。
/加密publicstaticStringencrypt(byte[]dataSource,Stringpassword){try{SecureRandomrandom=newSecureRandom();DESKeySpecdesKeySpec=newDESKeySpec(password.getBytes());//創建一個密匙工廠,然后用它把DESKeySpec轉換成SecretKeyFactorysecretKeyFactory=SecretKeyFactory.getInstance("DES");SecretKeysecretKey=secretKeyFactory.generateSecret(desKeySpec);//Cipher對象實際完成加密操作Ciphercipher=Cipher.getInstance("DES");//用密匙初始化Cipher對象cipher.init(Cipher.ENCRYPT_MODE,secretKey,random);//正式執行加密操作returnBase64.encodeBase64String(cipher.doFinal(dataSource));}catch(Throwablee){e.printStackTrace();}returnnull;}//解密publicstaticStringdecrypt(Stringsrc,Stringpassword)throwsException{//DES算法要求有一個可信任的隨機數源SecureRandomrandom=newSecureRandom();//創建一個DESKeySpec對象DESKeySpecdesKeySpec=newDESKeySpec(password.getBytes());//創建一個密匙工廠SecretKeyFactorykeyFactory=SecretKeyFactory.getInstance("DES");//將DESKeySpec對象轉換成SecretKey對象SecretKeysecretKey=keyFactory.generateSecret(desKeySpec);//Cipher對象實際完成解密操作Ciphercipher=Cipher.getInstance("DES");//用密匙初始化Cipher對象cipher.init(Cipher.DECRYPT_MODE,secretKey,random);//真正開始解密操作returnnewString(cipher.doFinal(Base64.decodeBase64(src)));}
2.2 3DES
3DES(即Triple DES)是DES向AES過渡的加密算法,它使用3條56位的密鑰對數據進行三次加密。是DES的一個更安全的變形。它以DES為基本模塊,通過組合分組方法設計出分組加密算法。比起最初的DES,3DES更為安全。密鑰長度默認為168位,還可以選擇128位。
publicstaticStringencryptThreeDESECB(Stringsrc,Stringkey){try{DESedeKeySpecdks=newDESedeKeySpec(key.getBytes("UTF-8"));SecretKeyFactorykeyFactory=SecretKeyFactory.getInstance("DESede");SecretKeysecurekey=keyFactory.generateSecret(dks);Ciphercipher=Cipher.getInstance("DESede/ECB/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE,securekey);byte[]b=cipher.doFinal(src.getBytes("UTF-8"));Stringss=newString(Base64.encodeBase64(b));ss=ss.replaceAll("\\+","-");ss=ss.replaceAll("/","_");returnss;}catch(Exceptionex){ex.printStackTrace();returnsrc;}}publicstaticStringdecryptThreeDESECB(Stringsrc,Stringkey){try{src=src.replaceAll("-","+");src=src.replaceAll("_","/");byte[]bytesrc=Base64.decodeBase64(src.getBytes("UTF-8"));//--解密的keyDESedeKeySpecdks=newDESedeKeySpec(key.getBytes("UTF-8"));SecretKeyFactorykeyFactory=SecretKeyFactory.getInstance("DESede");SecretKeysecurekey=keyFactory.generateSecret(dks);//--Chipher對象解密Ciphercipher=Cipher.getInstance("DESede/ECB/PKCS5Padding");cipher.init(Cipher.DECRYPT_MODE,securekey);byte[]retByte=cipher.doFinal(bytesrc);returnnewString(retByte,"UTF-8");}catch(Exceptionex){ex.printStackTrace();returnsrc;}}
2.3 AES
AES 高級數據加密標準,能夠有效抵御已知的針對DES算法的所有攻擊,默認密鑰長度為128位,還可以供選擇192位,256位。這里順便提一句這個位指的是bit。
privatestaticfinalStringdefaultCharset="UTF-8";privatestaticfinalStringKEY_AES="AES";privatestaticfinalStringKEY_MD5="MD5";privatestaticMessageDigestmd5Digest;static{try{md5Digest=MessageDigest.getInstance(KEY_MD5);}catch(NoSuchAlgorithmExceptione){}}/***加密*/publicstaticStringencrypt(Stringdata,Stringkey){returndoAES(data,key,Cipher.ENCRYPT_MODE);}/***解密*/publicstaticStringdecrypt(Stringdata,Stringkey){returndoAES(data,key,Cipher.DECRYPT_MODE);}/***加解密*/privatestaticStringdoAES(Stringdata,Stringkey,intmode){try{booleanencrypt=mode==Cipher.ENCRYPT_MODE;byte[]content;if(encrypt){content=data.getBytes(defaultCharset);}else{content=Base64.decodeBase64(data.getBytes());}SecretKeySpeckeySpec=newSecretKeySpec(md5Digest.digest(key.getBytes(defaultCharset)),KEY_AES);Ciphercipher=Cipher.getInstance(KEY_AES);//創建密碼器cipher.init(mode,keySpec);//初始化byte[]result=cipher.doFinal(content);if(encrypt){returnnewString(Base64.encodeBase64(result));}else{returnnewString(result,defaultCharset);}}catch(Exceptione){}returnnull;}
推薦使用對稱加密算法有:AES128、AES192、AES256。
三、非對稱加密算法
非對稱加密算法有兩個密鑰,這兩個密鑰完全不同但又完全匹配。只有使用匹配的一對公鑰和私鑰,才能完成對明文的加密和解密過程。常見的非對稱加密有RSA、SM2等。
3.1 RSA
RSA密鑰至少為500位長,一般推薦使用1024位。
//非對稱密鑰算法publicstaticfinalStringKEY_ALGORITHM="RSA";/***密鑰長度,DH算法的默認密鑰長度是1024*密鑰長度必須是64的倍數,在512到65536位之間*/privatestaticfinalintKEY_SIZE=1024;//公鑰privatestaticfinalStringPUBLIC_KEY="RSAPublicKey";//私鑰privatestaticfinalStringPRIVATE_KEY="RSAPrivateKey";/***初始化密鑰對**@returnMap甲方密鑰的Map*/publicstaticMap<String,Object>initKey()throwsException{//實例化密鑰生成器KeyPairGeneratorkeyPairGenerator=KeyPairGenerator.getInstance(KEY_ALGORITHM);//初始化密鑰生成器keyPairGenerator.initialize(KEY_SIZE);//生成密鑰對KeyPairkeyPair=keyPairGenerator.generateKeyPair();//甲方公鑰RSAPublicKeypublicKey=(RSAPublicKey)keyPair.getPublic();//甲方私鑰RSAPrivateKeyprivateKey=(RSAPrivateKey)keyPair.getPrivate();//將密鑰存儲在map中Map<String,Object>keyMap=newHashMap<String,Object>();keyMap.put(PUBLIC_KEY,publicKey);keyMap.put(PRIVATE_KEY,privateKey);returnkeyMap;}/***私鑰加密**@paramdata待加密數據*@paramkey密鑰*@returnbyte[]加密數據*/publicstaticbyte[]encryptByPrivateKey(byte[]data,byte[]key)throwsException{//取得私鑰PKCS8EncodedKeySpecpkcs8KeySpec=newPKCS8EncodedKeySpec(key);KeyFactorykeyFactory=KeyFactory.getInstance(KEY_ALGORITHM);//生成私鑰PrivateKeyprivateKey=keyFactory.generatePrivate(pkcs8KeySpec);//數據加密Ciphercipher=Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE,privateKey);returncipher.doFinal(data);}/***公鑰加密**@paramdata待加密數據*@paramkey密鑰*@returnbyte[]加密數據*/publicstaticbyte[]encryptByPublicKey(byte[]data,byte[]key)throwsException{//實例化密鑰工廠KeyFactorykeyFactory=KeyFactory.getInstance(KEY_ALGORITHM);//初始化公鑰//密鑰材料轉換X509EncodedKeySpecx509KeySpec=newX509EncodedKeySpec(key);//產生公鑰PublicKeypubKey=keyFactory.generatePublic(x509KeySpec);//數據加密Ciphercipher=Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE,pubKey);returncipher.doFinal(data);}/***私鑰解密**@paramdata待解密數據*@paramkey密鑰*@returnbyte[]解密數據*/publicstaticbyte[]decryptByPrivateKey(byte[]data,byte[]key)throwsException{//取得私鑰PKCS8EncodedKeySpecpkcs8KeySpec=newPKCS8EncodedKeySpec(key);KeyFactorykeyFactory=KeyFactory.getInstance(KEY_ALGORITHM);//生成私鑰PrivateKeyprivateKey=keyFactory.generatePrivate(pkcs8KeySpec);//數據解密Ciphercipher=Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE,privateKey);returncipher.doFinal(data);}/***公鑰解密**@paramdata待解密數據*@paramkey密鑰*@returnbyte[]解密數據*/publicstaticbyte[]decryptByPublicKey(byte[]data,byte[]key)throwsException{//實例化密鑰工廠KeyFactorykeyFactory=KeyFactory.getInstance(KEY_ALGORITHM);//初始化公鑰//密鑰材料轉換X509EncodedKeySpecx509KeySpec=newX509EncodedKeySpec(key);//產生公鑰PublicKeypubKey=keyFactory.generatePublic(x509KeySpec);//數據解密Ciphercipher=Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE,pubKey);returncipher.doFinal(data);}/***取得私鑰**@paramkeyMap密鑰map*@returnbyte[]私鑰*/publicstaticbyte[]getPrivateKey(Map<String,Object>keyMap){Keykey=(Key)keyMap.get(PRIVATE_KEY);returnkey.getEncoded();}/***取得公鑰**@paramkeyMap密鑰map*@returnbyte[]公鑰*/publicstaticbyte[]getPublicKey(Map<String,Object>keyMap)throwsException{Keykey=(Key)keyMap.get(PUBLIC_KEY);returnkey.getEncoded();}
四、加密鹽
加密鹽也是比較常聽到的一個概念,鹽就是一個隨機字符串用來和我們的加密串拼接后進行加密。加鹽主要是為了提供加密字符串的安全性。假如有一個加鹽后的加密串,黑客通過一定手段這個加密串,他拿到的明文,并不是我們加密前的字符串,而是加密前的字符串和鹽組合的字符串,這樣相對來說又增加了字符串的安全性。
以上就是“web中常用的加密算法有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注本站行業資訊頻道。
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...
2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...
:喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...
(相關資料圖)最近小編看到大家都在討論魂牽夢縈近義詞相關的事情,對此呢小編也是非常的感應興趣,那么這件事究竟是怎么發生的呢?具體又是怎么回事呢?下面就是小編搜索到的關于魂牽夢縈近義詞事件的相關信息,我們一起來看一下吧!神魂顛倒、如癡如醉、夜不能寐、念念不忘、日思夜想、夢寐不忘、輾轉反側、魂牽夢繞、夢寐以求、朝思暮想等。...
【資料圖】在生活中,很多人都不知道北京的三聯書店在什么地方是什么意思,其實他的意思是非常簡單的,下面就是小編搜索到的北京的三聯書店在什么地方相關的一些知識,我們一起來學習下吧!北京市的三聯書店有:五道口店:位于北京市清華同方科技大廈D座1層。美術館店:位于北京市東城區美術館東街22號。西三環南路店:位于北京市西三環南路1號北京市政務服務中心內一層。亦莊店:位于北京市大興區隆慶街6號77文創園?;佚?..
什么是支付手段?支付手段是指貨幣用于清償債務、支付賦稅、租金、工資等的職能。這一職能是為適應商品生產和商品交換發展的需要而發展起來的。由于商品生產和商品交換在時空上的差異,就產生了商品使用價值的讓渡與商品價值的實現在時間上分離開來的客觀必然性。某些商品消費者在需要購買時沒有貨幣,只有到將來某一時間才有支付能力,同時,某些商品生產者又急需出售其商品,于是就產生了賒購賒銷。支付手段是指在交易過程中交易...