Java加密算法與互聯網安全

一、互聯網數據傳輸安全

互聯網安全是個龐大的概念,這裏僅討論網絡中兩個節點之間的通信(通常是客戶端和服務端),如何保證數據不被竊取?
答案是通過加解密,使得數據即使被第三方攔截,第三方也無法獲取有效的信息。

&*x#

加密的消息
主機1

Hello -> 密鑰&加密
主機2

密鑰&解密 -> Hello

二、加密算法介紹

數字摘要算法

對一段消息,通過單向Hash函數,生成一段固定長度的並且唯一的摘要。
有些人也稱消息摘要算法爲單向加密的算法,因爲生成的摘要無法解密回原來的消息。

消息
Hash函數
消息摘要

常用消息摘要算法

算法 摘要長度(位)
MD5 128
SHA-1 160

Java中使用數字摘要算法

jdk定義了MessageDegist類,代表消息摘要算法。

	public static byte[] messageDigest(String algorithm, byte[] content) {
		try {
			MessageDigest digest = MessageDigest.getInstance(algorithm);
			return digest.digest(content);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
	
	public static byte[] md5(byte[] content) {
		return messageDigest("MD5", content);
	}
	
	public static byte[] sha1(byte[] content) {
		return messageDigest("SHA-1", content);
	}

對稱加密算法

對稱加密算法只有一個密鑰,加密消息和解密消息都使用同一個密鑰。
使用對稱加密算法,只要私鑰不泄露,雙方傳輸的消息就是安全的。

密鑰
密鑰
明文
密文
明文

常見的對稱加密算法

算法 密鑰長度(位)
DES 56
AES 128或192或256

Java中使用對稱加密

實際上jdk提供了加解密的框架,主要接口如下:

接口 說明
SecretKey 密鑰,用於加解密
Cipher 代表一種加密算法,使用密鑰進行加密或解密

java代碼如下:

/**
	 * 生成對稱加密算法密鑰
	 * @param algorithm 算法
	 * @param keySize 密鑰長度
	 * @return
	 */
	public static SecretKey genSymmetricSecretKey(String algorithm, int keySize) {
		try {
			KeyGenerator generator = KeyGenerator.getInstance(algorithm);
			generator.init(keySize);
			return generator.generateKey();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
	
	public static SecretKey genDESSecretKey() {
		return genSymmetricSecretKey("DES", 56);
	}
	
	public static SecretKey genAESSecretKey() {
		return genSymmetricSecretKey("AES", 128);
	}
	
	/**
	 * 使用密鑰對明文加密
	 * @param secretKey 密鑰
	 * @param content 明文
	 * @return
	 */
	public static byte[] encrypt(Key secretKey, byte[] content) {
		try {
			Cipher cipher = Cipher.getInstance(secretKey.getAlgorithm());
			cipher.init(Cipher.ENCRYPT_MODE, secretKey);
			return cipher.doFinal(content);
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
	
	/**
	 * 解密
	 * @param secretKey
	 * @param secret
	 * @return
	 */
	public static byte[] decrypt(Key secretKey, byte[] secret) {
		try {
			Cipher cipher = Cipher.getInstance(secretKey.getAlgorithm());
			cipher.init(Cipher.DECRYPT_MODE, secretKey);
			return cipher.doFinal(secret);
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}

非對稱加密算法

非對稱加密算法中,存在兩個密鑰。一個公鑰、一個私鑰。
私鑰加密的消息,可被私鑰解密;公鑰加密的消息,可被私鑰解密。
如下所示:

私鑰
公鑰
公鑰
私鑰
明文
密文
明文

私鑰不對外開發,而公鑰則對外開放。
由於公鑰對外開放,因此,公鑰加密的消息實際上是不安全的,因爲其他人也可以獲得公鑰。
而由於私鑰不對外公開,經過私鑰加密的消息只能由公鑰解密,所以私鑰加密的消息可認爲是安全的。
因此,非對稱算法可用於私鑰持有方的身份驗證,而不能確保通信雙方的信息安全。
常用的非對稱加密算法是RSA算法。

Java中使用非對稱加密算法

和對稱加密不同的是,新增了KeyPair類,通過KeyPair可以獲取PrivateKey以及PublicKey。
但和SecretKey類一致的是,他們都繼承了java.security.Key接口,因此加解密的方式相同,只是非對稱加密在加密和解密時需要傳入不同的Key。

/**
	 * 生成非對稱加密算法密鑰對(包括公鑰私鑰)
	 * @param algorithm
	 * @param keySize
	 * @return
	 */
	public static KeyPair genKeyPair(String algorithm, int keySize) {
		try {
			KeyPairGenerator generator = KeyPairGenerator.getInstance(algorithm);
			generator.initialize(keySize);
			return generator.generateKeyPair();
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
	
	public static KeyPair genRSAKeyPair() {
		return genKeyPair("RSA", 512);
	}

密碼學在互聯網安全中的應用

數字簽名

數字簽名 = (非對稱加密 + 消息摘要) + 消息正文

前面說過,在非對稱算法中,私鑰擁有方發送的消息是安全的
那麼,私有持有者每次加密整個正文,再發送消息,則可保證消息的安全性。

問題
每次加密整個消息正文,需要耗費很大的CPU資源。

解決方案
先使用效率更高的消息摘要算法,生成消息摘要,然後只對消息摘要使用私鑰加密,將加密後的摘要和消息原文一起發送。

對方收到報文,使用公鑰解密摘要,然後使用相同的消息摘要算法將正文生成摘要,和解密後的摘要進行對比,即可確定正文是否被更改了。

這樣的消息被稱爲數字簽名。

在這裏插入圖片描述

數字證書

數字證書是一種特殊的數字簽名,該數字簽名的消息正文內容包括:證書持有者身份、證書持有者的公鑰。

簽名說過,公鑰的獲取是不安全的,有沒有辦法使得獲取公鑰的過程是安全的呢?
答案是肯定的,解決方案如下:
由受信賴的第三方機構(稱爲CA)頒發公鑰,頒發的方式是,對公鑰持有者的身份,以及公鑰,使用CA的私鑰進行數字簽名。
如百度的數字證書爲:

在這裏插入圖片描述
那麼問題來了,CA的公鑰如何獲取呢?
實際上,知名的CA機構的證書已經默認安裝在操作系統中,稱爲根證書,爲CA機構給自己頒發的數字證書。
安裝了根證書,代表信任該CA機構。
通過IE瀏覽器可以查看操作系統中已安裝的證書:
在這裏插入圖片描述

SSL

SSL利用數字證書,保證公鑰的合法性。使用非對稱加密算法,協商對稱加密算法密鑰。此後使用對稱加密算法對消息加密後進行通信。對稱加密算法效率高於非對稱加密算法,是這樣實現的原因。

關於SSL,有一篇文章講述的很好,就不再贅述了:
https://showme.codes/2017-02-20/understand-https/

總結

  • 使用對稱加密算法,密鑰不丟失,可保證通信安全
  • 使用非對稱加密算法,私鑰持有方發送的消息安全,而公鑰持有方發送的消息則不安全。
  • 利用可信賴的第三方機構(CA),可安全發佈公鑰(通過數字證書)。
  • 對稱加密算法消息比非對稱加密算法執行效率更高
  • 使用SSL可保證通信安全,SSL在建立連接階段使用非對稱加密,在通信階段使用對稱加密
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章