幾種常見的加密算法及 Java 實現

介紹

本文主要對加密算法做個概況性的介紹,然後給出幾種簡單的加密算法 Java 實現。

1. 算法種類

  • 單向加密

  • 對稱加密

  • 非對稱加密

1.1 單向加密

即加密之後不能解密,一般用於數據驗證

1) Base64

Base64 編碼是從二進制到字符的過程,用 64 個字符來表示任意的二進制數據,常用於在 HTTP 加密,圖片編碼傳輸等。

可打印字符:在ASCII碼中規定,0~31、128 這33個字符屬於控制字符,32~127這95個字符屬於可打印字符

轉換方式:在 HTTP 協議下傳輸二進制數據時需要將其轉換爲字符數據,而網絡傳輸只能傳輸可打印字符(95 個),不能轉換的就需要使用 Base64 進行轉換。

轉換方法

  • 1 字節(byte) = 8 比特位(bit)

  • Base64 定義了 64 (2^6)個可打印字符表示二進制的方法,也就是說 6 個 bit 的二進制數據可以用對應的字符代替表示

  • 對於連續多個二進制數據,每 3 個字節一組進行轉換,3個字節 24 bit,然後將其分爲 4 部分(3×8 = 4×6),每個部分剛好 6 bit,將 6 bit 二進制轉換爲 Base64 定義的字符即完成轉換

  • 例, 6 bit 二進制是 000000,那麼對應的字符就是 A,如果 6 bit 二進制是 110011,那麼對應的字符就是 z

  • 若二進制數據字節數不是 3 的倍數,Base64 就將剩下的二進制數據補 0 至 3 的倍數,全 0 的用字符 “=” 代替

參考: https://blog.csdn.net/qq_20545367/article/details/79538530

2) MD5

Message Digest algorithm 5,信息摘要算法,MD5

  • 一般用於確保信息的傳輸完整一致性,校驗傳輸的數據是否被修改,一旦原始信息被修改,生成的 MD5 值將會變得很不同

  • 算法能將任意大小、格式的文字或文件進行加密從而產生 128 bit(16 字節)的散列值。如同人的指紋,不同文本的 MD5 值是不同的。

  • 極端情況:就是不同的字符串的 MD5 值一樣,這叫哈希碰撞。2009 年中科院就已經實現了相應的碰撞算法,不過 MD5 應用仍然很廣泛

  • 一般不可破解,除非使用窮舉法,難度依舊很大

3) SHA 家族

  • 是一個密碼散列函數家族,是 FIPS 所認證的安全散列算法

  • 和 MD5 類似,都是對文本進行散列,產生一定長度的散列值

4) HMAC

Hash Message Authentication Code,散列消息鑑別碼

  • 是一種通過特別計算方式之後產生的消息認證碼(MAC),使用密碼散列函數,同時結合一個加密密鑰。它可以用來保證數據的完整性,同時可以用來作某個消息的身份驗證。


1.2 對稱加密

對稱加密的意思就是信息收發都有相同的一把鑰匙,消息的加密解密都用這進行

1)DES

  • Data Encryption Standard,數據加密標準,速度較快,適用於加密大量數據的場合。

2)AES

  • Advanced Encryption Standard,高級加密標準,是下一代的加密算法標準,速度快,安全級別高;


1.3 非對稱加密

非對稱加密算法是一種密鑰的保密方法。 非對稱加密算法需要兩個密鑰:公開密鑰(publickey)和私有密鑰(privatekey)。 公開密鑰與私有密鑰是一對,如果用公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密;如果用私有密鑰對數據進行加密,那麼只有用對應的公開密鑰才能解密。

1)RSA

  • 名稱來源於發明這個算法的三個人的姓氏組成,算法大致內容就是對極大整數進行因式分解

  • 這種算法非常可靠,密鑰越長,它就越難破解。根據已經披露的文獻,目前被破解的最長 RSA密鑰是768個二進制位。也就是說,長度超過768位的密鑰,還無法破解(至少沒人公開宣佈)。因此可以認爲,1024位的RSA密鑰基本安全,2048位的密鑰極其安全。

http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html

2)DSA

Digital Signature Algorithm,數字簽名算法,是一種標準的 DSS(數字簽名標準);

3)ECC

  • Elliptic Curves Cryptography,橢圓曲線密碼編碼學。

  • 一種建立公開密鑰加密的算法,基於橢圓曲線數學。

  • ECC的主要優勢是在某些情況下它比其他的方法使用更小的密鑰——比如RSA加密算法——提供相當的或更高等級的安全。ECC的另一個優勢是可以定義羣之間的雙線性映射,基於Weil對或是Tate對;雙線性映射已經在密碼學中發現了大量的應用,例如基於身份的加密。不過一個缺點是加密和解密操作的實現比其他機制花費的時間長。

2. 算法實現(java)

Base64

public static void main(String[] args) {    try {        // 編碼
        String encode = Base64.getEncoder().encodeToString("son".getBytes("UTF-8"));
        System.out.println(encode);  // c29u
        // 解碼
        byte[] decode = Base64.getDecoder().decode("c29u");
        System.out.println(new String(decode, "UTF-8"));  // 周杰倫
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
}

MD5 和 SHA 家族

public static void main(String[] args) {
    
    String content = "you are my son"; // 原文
    try {        byte[] a;
        MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");
        a = messageDigest.digest(content.getBytes());
        System.out.println(byte2hex(a)); // 333a9634d8809b5a9e8d280d82553b8fd8d4a911

        messageDigest = MessageDigest.getInstance("SHA-256");
        a = messageDigest.digest(content.getBytes());
        System.out.println(byte2hex(a)); // cdb2c97079d9a1943eea98de4201f5c4f49ecda5af2b364e1c7a5d1ae89688eb

        messageDigest = MessageDigest.getInstance("MD5");
        a = messageDigest.digest(content.getBytes());
        System.out.println(byte2hex(a)); // 6fe6b9a8f8bd29f4f4f1368a0619a7ae

        // 第三方 MD5 算法。需要添加 jar 包 org.apache.commons.codec.digest.DigestUtils
        String encodeStr=DigestUtils.md5Hex(content);
        System.out.println(encodeStr); // 6fe6b9a8f8bd29f4f4f1368a0619a7ae

    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
}public static String byte2hex(byte[] b) //二進制轉字符串{
    String hs = "";
    String stmp = "";    for (int n = 0; n < b.length; n++) {
        stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));        if (stmp.length() == 1) {
            hs = hs + "0" + stmp;
        } else {
            hs = hs + stmp;
        }
    }    return hs;
}

總結

  • 現在的加密算法大部分情況下是爲了驗證數據的一致性,例如傳遞一些參數組的時候,簡單的會使用 BASE64 或 MD5 進行加密生成一個簽名。複雜點就是 BASE64 編碼之後再用 對稱密鑰再加密一次,達到比較不容易被人篡改的目的

  • 對於一些支付場景,一般使用 非對稱加密算法 實現,這樣的場景需要的安全性更高。

  • 其它博客參考


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章