1. <nobr id="easjo"><address id="easjo"></address></nobr>

      <track id="easjo"><source id="easjo"></source></track>
      1. 
        

      2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
      3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>
          貴州做網站公司
          貴州做網站公司~專業!靠譜!
          10年網站模板開發經驗,熟悉國內外開源網站程序,包括DEDECMS,WordPress,ZBlog,Discuz! 等網站程序,可為您提供網站建設,網站克隆,仿站,網頁設計,網站制作,網站推廣優化等服務。我們專注高端營銷型網站,企業官網,集團官網,自適應網站,手機網站,網絡營銷,網站優化,網站服務器環境搭建以及托管運維等。為客戶提供一站式網站解決方案?。?!

          盤點五種最常用加密算法!

          來源:互聯網轉載 時間:2023-09-04 07:52:14

          大家好,我是老三,大家都知道我是一個臭做支付的,支付常常要和一些加簽、驗簽,加密、解密打交道,今天,就給大家來盤點一下最常見的5種加密算法。

          前言

          大家平時的工作中,可能也在很多地方用到了加密、解密,比如:

          • 用戶的密碼不能明文存儲,要存儲加密后的密文
          • 用戶的銀行卡號、身份證號之類的敏感數據,需要加密傳輸
          • 還有一些重要接口,比如支付,客戶端要對請求生成一個簽名,服務端要對簽名進行驗證
          • ……

          那么上面提到的這些能力,我們都可以利用哪些加密算法來實現呢?咱們接著往下看。

          常見加密算法

          算法整體上可以分為不可逆加密,以及可逆加密,可逆加密又可以分為對稱加密非對稱加密。

          不可逆算法

          不可逆加密的算法的加密是不可逆的,密文無法被還原成原文。

          散列算法,就是一種不可逆算法。散列算法中,明文通過散列算法生成散列值,散列值是長度固定的數據,和明文長度無關。

          散列算法的具體實現有很多種,常見的包括MD5、SHA1、SHA-224、SHA-256等等。

          散列算法常用于數字簽名、消息認證、密碼存儲等場景。

          散列算法是不需要密鑰的,當然也有一些不可逆算法,需要密鑰,例如HMAC算法。

          MD5

          MD5,全稱為“Message-Digest Algorithm 5”,翻譯過來叫“信息摘要算法”。它可以將任意長度的數據通過散列算法,生成一個固定長度的散列值。MD5算法的輸出長度為128位,通常用32個16進制數表示。

          我們來看下MD5算法的Java代碼實現:

          public class MD5 {private static final String MD5_ALGORITHM = "MD5";public static String encrypt(String data) throws Exception {// 獲取MD5算法實例MessageDigest messageDigest = MessageDigest.getInstance(MD5_ALGORITHM);// 計算散列值byte[] digest = messageDigest.digest(data.getBytes());Formatter formatter = new Formatter();// 補齊前導0,并格式化for (byte b : digest) {formatter.format("%02x", b);}return formatter.toString();}public static void main(String[] args) throws Exception {String data = "Hello World";String encryptedData = encrypt(data);System.out.println("加密后的數據:" + encryptedData);} }

          MD5有一些優點,比如計算速度快、輸出長度固定、應用廣泛等等。

          但是作為一個加密算法,它有一個天大的缺點,那就是不安全。

          MD5算法已經被攻破,而且MD5算法的輸出長度有限,攻擊者可以通過暴力破解或彩虹表攻擊等方式,找到與原始數據相同的散列值,從而破解數據。

          雖然可以通過加鹽,也就是對在原文里再加上一些不固定的字符串來緩解,但是完全可以用更安全的SHA系列算法替代。

          SHA-256

          SHA(Secure Hash Algorithm)系列算法是一組密碼散列函數,用于將任意長度的數據映射為固定長度的散列值。SHA系列算法由美國國家安全局(NSA)于1993年設計,目前共有SHA-1、SHA-2、SHA-3三種版本。

          其中SHA-1系列存在缺陷,已經不再被推薦使用。

          SHA-2算法包括SHA-224、SHA-256、SHA-384和SHA-512四種散列函數,分別將任意長度的數據映射為224位、256位、384位和512位的散列值。

          我們來看一下最常用的SHA-256的Java代碼實現:

          public class SHA256 {private static final String SHA_256_ALGORITHM = "SHA-256";public static String encrypt(String data) throws Exception {//獲取SHA-256算法實例MessageDigest messageDigest = MessageDigest.getInstance(SHA_256_ALGORITHM);//計算散列值byte[] digest = messageDigest.digest(data.getBytes());StringBuilder stringBuilder = new StringBuilder();//將byte數組轉換為15進制字符串for (byte b : digest) {stringBuilder.append(Integer.toHexString((b & 0xFF) | 0x100), 1, 3);}return stringBuilder.toString();}public static void main(String[] args) throws Exception {String data = "Hello World";String encryptedData = encrypt(data);System.out.println("加密后的數據:" + encryptedData);} }

          SHA-2算法之所以比MD5強,主要有兩個原因:

          • 散列值長度更長:例如SHA-256算法的散列值長度為256位,而MD5算法的散列值長度為128位,這就提高了攻擊者暴力破解或者彩虹表攻擊的難度。
          • 更強的碰撞抗性:SHA算法采用了更復雜的運算過程和更多的輪次,使得攻擊者更難以通過預計算或巧合找到碰撞。

          當然,SHA-2也不是絕對安全的,散列算法都有被暴力破解或者彩虹表攻擊的風險,所以,在實際的應用中,加鹽還是必不可少的。

          對稱加密算法

          對稱加密算法,使用同一個密鑰進行加密和解密。

          加密和解密過程使用的是相同的密鑰,因此密鑰的安全性至關重要。如果密鑰泄露,攻擊者可以輕易地破解加密數據。

          常見的對稱加密算法包括DES、3DES、AES等。其中,AES算法是目前使用最廣泛的對稱加密算法之一,具有比較高的安全性和加密效率。

          DES

          DES(Data Encryption Standard)算法是一種對稱加密算法,由IBM公司于1975年研發,是最早的一種廣泛應用的對稱加密算法之一。

          DES算法使用56位密鑰對數據進行加密,加密過程中使用了置換、替換、異或等運算,具有較高的安全性。

          我們來看下DES算法的Java代碼實現:

          public class DES {private static final String DES_ALGORITHM = "DES";/*** DES加密** @param data 待加密的數據* @param key 密鑰,長度必須為8位* @return 加密后的數據,使用Base64編碼*/public static String encrypt(String data, String key) throws Exception {// 根據密鑰生成密鑰規范KeySpec keySpec = new DESKeySpec(key.getBytes());// 根據密鑰規范生成密鑰工廠SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(DES_ALGORITHM);// 根據密鑰工廠和密鑰規范生成密鑰SecretKey secretKey = secretKeyFactory.generateSecret(keySpec);// 根據加密算法獲取加密器Cipher cipher = Cipher.getInstance(DES_ALGORITHM);// 初始化加密器,設置加密模式和密鑰cipher.init(Cipher.ENCRYPT_MODE, secretKey);// 加密數據byte[] encryptedData = cipher.doFinal(data.getBytes());// 對加密后的數據進行Base64編碼return Base64.getEncoder().encodeToString(encryptedData);}/*** DES解密** @param encryptedData 加密后的數據,使用Base64編碼* @param key 密鑰,長度必須為8位* @return 解密后的數據*/public static String decrypt(String encryptedData, String key) throws Exception {// 根據密鑰生成密鑰規范KeySpec keySpec = new DESKeySpec(key.getBytes());// 根據密鑰規范生成密鑰工廠SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(DES_ALGORITHM);// 根據密鑰工廠和密鑰規范生成密鑰SecretKey secretKey = secretKeyFactory.generateSecret(keySpec);// 對加密后的數據進行Base64解碼byte[] decodedData = Base64.getDecoder().decode(encryptedData);// 根據加密算法獲取解密器Cipher cipher = Cipher.getInstance(DES_ALGORITHM);// 初始化解密器,設置解密模式和密鑰cipher.init(Cipher.DECRYPT_MODE, secretKey);// 解密數據byte[] decryptedData = cipher.doFinal(decodedData);// 將解密后的數據轉換為字符串return new String(decryptedData);}public static void main(String[] args) throws Exception {String data = "Hello World";String key = "12345678"; String encryptedData = encrypt(data, key);System.out.println("加密后的數據:" + encryptedData);String decryptedData = decrypt(encryptedData, key);System.out.println("解密后的數據:" + decryptedData);} }

          DES的算法速度較快,但是在安全性上面并不是最優選擇,因為DES算法的密鑰長度比較短,被暴力破解和差分攻擊的風險比較高,一般推薦用一些更安全的對稱加密算法,比如3DES、AES。

          AES

          AES(Advanced Encryption Standard)即高級加密標準,是一種對稱加密算法,被廣泛應用于數據加密和保護領域。AES算法使用的密鑰長度為128位、192位或256位,比DES算法的密鑰長度更長,安全性更高。

          我們來看下AES算法的Java代碼實現:

          public class AES {private static final String AES_ALGORITHM = "AES";// AES加密模式為CBC,填充方式為PKCS5Paddingprivate static final String AES_TRANSFORMATION = "AES/CBC/PKCS5Padding";// AES密鑰為16位private static final String AES_KEY = "1234567890123456";// AES初始化向量為16位private static final String AES_IV = "abcdefghijklmnop";/*** AES加密** @param data 待加密的數據* @return 加密后的數據,使用Base64編碼*/public static String encrypt(String data) throws Exception {// 將AES密鑰轉換為SecretKeySpec對象SecretKeySpec secretKeySpec = new SecretKeySpec(AES_KEY.getBytes(), AES_ALGORITHM);// 將AES初始化向量轉換為IvParameterSpec對象IvParameterSpec ivParameterSpec = new IvParameterSpec(AES_IV.getBytes());// 根據加密算法獲取加密器Cipher cipher = Cipher.getInstance(AES_TRANSFORMATION);// 初始化加密器,設置加密模式、密鑰和初始化向量cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);// 加密數據byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));// 對加密后的數據使用Base64編碼return Base64.getEncoder().encodeToString(encryptedData);}/*** AES解密** @param encryptedData 加密后的數據,使用Base64編碼* @return 解密后的數據*/public static String decrypt(String encryptedData) throws Exception {// 將AES密鑰轉換為SecretKeySpec對象SecretKeySpec secretKeySpec = new SecretKeySpec(AES_KEY.getBytes(), AES_ALGORITHM);// 將AES初始化向量轉換為IvParameterSpec對象IvParameterSpec ivParameterSpec = new IvParameterSpec(AES_IV.getBytes());// 根據加密算法獲取解密器Cipher cipher = Cipher.getInstance(AES_TRANSFORMATION);// 初始化解密器,設置解密模式、密鑰和初始化向量cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);// 對加密后的數據使用Base64解碼byte[] decodedData = Base64.getDecoder().decode(encryptedData);// 解密數據byte[] decryptedData = cipher.doFinal(decodedData);// 返回解密后的數據return new String(decryptedData, StandardCharsets.UTF_8);}public static void main(String[] args) throws Exception {String data = "Hello World";String encryptedData = encrypt(data);System.out.println("加密后的數據:" + encryptedData);String decryptedData = decrypt(encryptedData);System.out.println("解密后的數據:" + decryptedData);} }

          AES算法采用的密鑰長度更長,密鑰空間更大,安全性更高,能夠有效地抵抗暴力破解攻擊。

          當然,因為密鑰長度較長,需要的存儲也更多。

          對于對稱加密算法而言,最大的痛點就在于密鑰管理困難,相比而言,非對稱加密就沒有這個擔憂。

          非對稱加密算法

          非對稱加密算法需要兩個密鑰,這兩個密鑰互不相同,但是相互匹配,一個稱為公鑰,另一個稱為私鑰。

          使用其中的一個加密,則使用另一個進行解密。例如使用公鑰加密,則需要使用私鑰解密。

          RSA

          RSA算法是是目前應用最廣泛的非對稱加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman三人在1978年發明,名字來源三人的姓氏首字母。

          我們看下RSA算法的Java實現:

          public class RSA {private static final String RSA_ALGORITHM = "RSA";/*** 生成RSA密鑰對** @return RSA密鑰對*/public static KeyPair generateKeyPair() throws NoSuchAlgorithmException {KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(RSA_ALGORITHM);keyPairGenerator.initialize(2048); // 密鑰大小為2048位return keyPairGenerator.generateKeyPair();}/*** 使用公鑰加密數據** @param data 待加密的數據* @param publicKey 公鑰* @return 加密后的數據*/public static String encrypt(String data, PublicKey publicKey) throws Exception {Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE, publicKey);byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));return Base64.getEncoder().encodeToString(encryptedData);}/*** 使用私鑰解密數據** @param encryptedData 加密后的數據* @param privateKey 私鑰* @return 解密后的數據*/public static String decrypt(String encryptedData, PrivateKey privateKey) throws Exception {byte[] decodedData = Base64.getDecoder().decode(encryptedData);Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, privateKey);byte[] decryptedData = cipher.doFinal(decodedData);return new String(decryptedData, StandardCharsets.UTF_8);}public static void main(String[] args) throws Exception {KeyPair keyPair = generateKeyPair();PublicKey publicKey = keyPair.getPublic();PrivateKey privateKey = keyPair.getPrivate();String data = "Hello World";String encryptedData = encrypt(data, publicKey);System.out.println("加密后的數據:" + encryptedData);String decryptedData = decrypt(encryptedData, privateKey);System.out.println("解密后的數據:" + decryptedData);} }

          RSA算法的優點是安全性高,公鑰可以公開,私鑰必須保密,保證了數據的安全性;可用于數字簽名、密鑰協商等多種應用場景。

          缺點是加密、解密速度較慢,密鑰長度越長,加密、解密時間越長;密鑰長度過短容易被暴力破解,密鑰長度過長則會增加計算量和存儲空間的開銷。

          總結

          這一期就給大家簡單盤點了一下最常用的5種加密算法。

          其實,論到加密解密算法的應用,有一個東西,可以說是應用到了極致,它是什么呢?

          —— HTTPS

          我們簡單回憶一下HTTPS的工作流程,和用到的加密算法:

        1. 客戶端發起HTTPS請求:用戶使用瀏覽器輸入網址訪問HTTPS站點,準備發起HTTPS請求
        2. 服務端提供證書:服務器返回公鑰證書,證書包含了服務器的公鑰、頒發者(證書頒發機構)等信息
        3. 客戶端驗證證書:瀏覽器驗證證書的有效性、合法性、來源等,校驗證書的過程用到了非對稱加密散列算法
          • 客戶端使用證書頒發機構的公鑰對證書進行驗證,保證證書的真實性和合法性
          • 客戶端使用證書中的公鑰對服務端的數字簽名進行驗證,保證服務器的身份和數據的完整性。
          • 客戶端使用散列算法計算出散列值,和證書種的散列值進行對比,保證證書的完整性
        4. 客戶端生成對稱密鑰:客戶端生成一個隨機數,作為對稱密鑰
        5. 對稱密鑰加密傳輸:客戶端使用服務器的公鑰對隨機數進行加密,然后將加密后的信息傳輸給服務器
        6. 服務端獲取對稱密鑰:服務端使用私鑰解密客戶端發送的對稱密鑰,得到對稱密鑰
        7. 客戶端與服務器使用對稱密鑰進行通信:服務器與瀏覽器都使用對稱密鑰對數據進行加密和解密,以此確保數據傳輸的安全性。
        8. 在數據傳輸的過程中,也用到了散列算法:

          • 消息摘要:在數據傳輸過程中,客戶端和服務器都使用散列算法計算消息的散列值,對方收到消息后,會對散列值進行比較,確保傳輸數據的完整性。

          總之,HTTPS使用了對稱加密算法、非對稱加密算法、散列算法來保證數據的安全性和完整性,從而確保了通信雙方的身份和數據的安全。

          至于具體使用哪些加密算法,取決于SSL/TLS協議的版本以及協商過程中選定的加密套件。在實際的網絡環境中,很多加密算法可能會被淘汰,以適應更高安全性的需要。

          在我們的日常開發中,也可以借鑒相應的思路,靈活運用各種加密算法,讓我們的應用更加安全、更加健壯。



          參考:

          [1]. https://segmentfault.com/a/1190000023445325

          [2]. https://juejin.cn/post/6844903638117122056

          網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...

          在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...

          在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...

          唐山三女河機場航班時刻表?來自環渤海新聞網的消息唐山機場自27日起開始運行夏秋航班。上海和廣州的航班時刻表沒有變化。唐山-石家莊-昆明航班時刻比冬春晚10分鐘。唐山-Xi安航班時刻暫停,唐山-宜昌-三亞航班時刻調整。新的時間比以前更方便市民出行。具體為08: 00從三亞起飛,10: 05到達宜昌,10: 45從宜昌起飛,12: 30到達唐山、唐山。實施日期為2012年3月27日至2012年9月30...

          北京到吉林高鐵什么時候通車?,根據鐵路12306網站上的公告,從北京到吉林的高速列車將于4月中旬的15號開始通車。目前,12306網站已經開始售票。北京至吉林直達航班9班,G3649恢復運行時間為4月15日,G3625、K215恢復正常運行時間為4月28日。Z117次恢復正常運行時間為4月30日,其他列車恢復時間為G3649次、G3623次、G915次、G4775次、G3627次、G3621次,可...

          DWORD是什么意思?DWORD(雙字)表示雙字節。兩個字(32位)是應用于許多地方的“值”。例如,在注冊表中,它屬于編程類也就是說,在Win32中unsign long是4個字節,它的長度是定義的。也就是說,它在Win32中有定義:“define DWORD unsigned long”,所以移植起來更方便Windows常用于保存地址(或指針)等可以使用unsigned long的地方。它也可以...

          TOP
          国产初高中生视频在线观看|亚洲一区中文|久久亚洲欧美国产精品|黄色网站入口免费进人
          1. <nobr id="easjo"><address id="easjo"></address></nobr>

              <track id="easjo"><source id="easjo"></source></track>
              1. 
                

              2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
              3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>