面試官:說一說你常用的加密算法有哪些?
加密算法通常被分為兩種:對稱加密和非對稱加密。其中,對稱加密算法在加密和解密時使用的密鑰相同;非對稱加密算法在加密和解密時使用的密鑰不同,分為公鑰和私鑰。此外,還有一類叫做消息摘要算法,是對數據進行摘要並且不可逆的算法。
這次我們了解一下消息摘要算法。
消息摘要算法
消息摘要算法是把任意長度的輸入揉和而產生長度固定的偽隨機結果的算法。在信息安全中,有許多重要的應用,都使用了消息摘要算法來實現,例如數字簽名、消息認證碼。
對於任何一個給定的數據,消息摘要算法都很容易就能運算出摘要結果。難以由一個已知的摘要結果,去推算出原始的數據。在不更動摘要結果的前提下,修改數據內容是不可行的。對於兩個不同的數據,只有極低的幾率會產生相同的摘要結果。
常見的對稱加密算法有:MD5算法、SHA。
MD5算法
MD5算法(Message Digest 5)是一種密碼散列函數,產生出一個128位的散列值,可以用一個長度為32的十六進制字符串表示。
MD5算法是由美國密碼學家Ronald Linn Rivest(這位大佬就是發明RSA算法的R)設計的,於1992年公開,用來取代之前的MD4算法(再之前還有MD3算法、MD2算法)。
MD5算法把原數據按每組512位大小進行分組,然后每一分組又被划分為16個32位子分組,再和事先定義好的4個幻數進行了一系列的位運算循環,最后得到四個32位的分組,將這四個32位分組級聯后將生成一個128位散列值。
我們用Java寫個例子:
import java.math.BigInteger;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class Md5Util {
private static final String MD5 = "MD5";
private static final Charset CHARSET = StandardCharsets.UTF_8;
public static String build(String input) throws NoSuchAlgorithmException {
MessageDigest md5 = MessageDigest.getInstance(MD5);
byte[] digest = md5.digest(input.getBytes(CHARSET));
return new BigInteger(1, digest).toString(16);
}
public static void main(String[] args) throws NoSuchAlgorithmException {
String msg = "我喜歡你,可以做我女朋友嗎?";
System.out.println("原文:" + msg);
System.out.println("摘要:" + build(msg));
}
}
運行結果如下:
原文:我喜歡你,可以做我女朋友嗎?
摘要:f9fa148f2cfffda9b5e15a9e5bf34b66
2004年,MD5算法被證實無法防止碰撞攻擊,因此不適用於安全性認證。
2009年,中國科學院的謝濤和馮登國僅用了$2^{20.96}$的碰撞算法復雜度,破解了MD5的碰撞抵抗,該攻擊在普通計算機上運行只需要數秒鍾。
2011年,IETF(Internet Engineering Task Force,互聯網工程任務組)發布RFC 6151,禁止MD5用作密鑰散列消息認證碼。
總之,MD5已經不安全,不要再繼續使用了。
SHA
SHA(Secure Hash Algorithm,安全散列算法)是一個密碼散列函數家族,是FIPS(Federal Information Processing Standards,聯邦信息處理標准)所認證的安全散列算法。
SHA家族包含一套逐步發展而來算法,有1993年發布的SHA-0、1995年發布的SHA-1、2001年發布的SHA-2、2015年發布的SHA-3。
由於對MD5出現成功的破解,以及對SHA-0和SHA-1出現理論上破解的方法,所以推薦使用SHA-2,或者更安全的SHA-3。
我們用Java寫個SHA-2的例子:
import java.math.BigInteger;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class ShaUtil {
private static final String SHA_256 = "SHA-256";
private static final String SHA_512 = "SHA-512";
private static final String SHA3_256 = "SHA3-256";
private static final String SHA3_512 = "SHA3-512";
private static final Charset CHARSET = StandardCharsets.UTF_8;
public static String build(String input, String algorithm) throws NoSuchAlgorithmException {
MessageDigest md5 = MessageDigest.getInstance(algorithm);
byte[] digest = md5.digest(input.getBytes(CHARSET));
return new BigInteger(1, digest).toString(16);
}
public static void main(String[] args) throws NoSuchAlgorithmException {
String msg = "我喜歡你,可以做我女朋友嗎?";
System.out.println("原文:" + msg);
System.out.println("SHA2-256摘要:" + build(msg, SHA_256));
System.out.println("SHA2-512摘要:" + build(msg, SHA_512));
System.out.println("SHA3-256摘要:" + build(msg, SHA3_256));
System.out.println("SHA3-512摘要:" + build(msg, SHA3_512));
}
}
運行結果如下:
原文:我喜歡你,可以做我女朋友嗎?
SHA2-256摘要:b6da8ee261f2b852c1140cf181e8d64b180ca6c884651ddb871bdff25afc836b
SHA2-512摘要:d65f455eb38a565fae8e7c3ea6dbc005612071d5e57b688f32674e9641ab9aa6f056381222ba47cc973c86380f24fd10f4078ad7bfd3d498210d721734740a5a
SHA3-256摘要:fc5f1427fc5a1bb2f231eec52fdaa5ac84652730143a3c7598dc2148ccd05cec
SHA3-512摘要:5d8ba707c40c39f37c8cffd2eabf8da8d6d4ede70c697402a5e5ea6228c5710c3d76a6abbc1d46413bfced66280f72621feac12ce3ef49aed60902091ca1979f
JDK8及以下版本不支持SHA-3,所以運行以上代碼時會出現NoSuchAlgorithmException
: SHA3-256 MessageDigest not available
異常。
總結
消息摘要算法是把任意長度的輸入揉和而產生長度固定的偽隨機結果的算法。常見的對稱加密算法有:MD5算法、SHA。
MD5算法不要再繼續使用了。SHA家族中,推薦使用SHA-2,或者更安全的SHA-3。
竟然已經看到這里了,你我定是有緣人,留下你的點贊和關注,他日必成大器。
微信公眾號:萬貓學社
微信掃描二維碼
關注后回復「電子書」
獲取12本Java必讀技術書籍
