精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

關于加解密、加簽驗簽的那些事

安全 應用安全
一般地,把對一個信息的摘要稱為該消息的指紋或數字簽名。數字簽名是保證信息的完整性和不可否認性的方法。數據的完整性是指信宿接收到的消息一定是信源發送的信息,而中間絕無任何更改;信息的不可否認性是指信源不能否認曾經發送過的信息。

1前言

面對MD5、SHA、DES、AES、RSA等等這些名詞你是否有很多問號?這些名詞都是什么?還有什么公鑰加密、私鑰解密、私鑰加簽、公鑰驗簽。這些都什么鬼?或許在你日常工作沒有聽說過這些名詞,但是一旦你要設計一個對外訪問的接口,或者安全性要求高的系統,那么必然會接觸到這些名詞。所以加解密、加簽驗簽對于一個合格的程序員來說是必須要掌握的一個概念。接下來我們就一文徹底搞懂這些概念。

2沒有硝煙的戰場——淺談密碼技術

沒有根基也許可以建一座小屋,但絕對不能造一座堅固的大廈。

密碼這個詞有很多種的解釋,在現代社會如果不接觸編程的話,那么普遍的認為是我們設置的登錄密碼、或者是去銀行取錢時輸入的數字。都是我們在注冊時實現給提供服務的一方存儲一組數字,以后我們登錄的時候就用這組數字相當于就證明了我們的身份。這個數字通常來說就是叫做密碼。

而我們需要了解的不是上面說的密碼,而是一種“密碼術”,就是對于要傳遞的信息按照某種規則進行轉換,從而隱藏信息的內容。這種方法可以使機密信息得以在公開的渠道傳遞而不泄密。使用這種方法,要經過加密過程。在加密過程中我們需要知道下面的這些概念:

  • 原文:或者叫明文,就是被隱藏的文字
  • 加密法:指隱藏原文的法則
  • 密文:或者叫偽文,指對原文按照加密法處理過后生成的可公開傳遞的文字
  • 密鑰:在加密法中起決定性的因素,可能是數字、詞匯,也可能是一些字母,或者這些東西的組合

加密的結果生成了密文,要想讓接受者能夠讀懂這些密文,那么就要把加密法以及密鑰告訴接受者,否者接受者無法對密文解密,也就無法讀懂原文。

從歷史的角度來看,密碼學大概可以分為古典密碼學和近現代密碼學兩個階段。兩者以現代信息技術的誕生為分界點,現在所討論的密碼學多指的是后者,建立在信息論和數學成果基礎之上的。

2.1 古典密碼學

古典密碼學源自于數千年前,最早在公元前1900年左右的古埃及,就出現了通過使用特殊字符和簡單替換式密碼來保護信息。美索不達米亞平原上曾經出土一個公元前1500年左右的泥板,其上記錄了加密描述的陶瓷器上釉的工藝配方。古希臘時期(公元前800 ﹣前146 年)還發明了通過物理手段來隱藏信息的“隱寫術”,例如使用牛奶書寫、用蠟覆蓋文字等。后來在古羅馬時期還出現了基于替換加密的凱撒密碼,據稱凱撒曾用此方法與其部下通信而得以命名。這些手段多數是采用簡單的機械工具來保護秘密,在今天看來毫無疑問是十分簡陋,很容易猜出來的。嚴格來看,可能都很難稱為密碼科學。

凱撒密碼是當偏移量是3的時候,所有的字母都A都將被替換成D,B變成E,以此類推。

圖片

2.2 近代密碼學

近代密碼學的研究來自于第一、二次世界大戰中對于軍事通信進行保護和猜出來的需求。1901年12月,意大利的工程師Guglielmo Marconi(奎里亞摩?馬可尼)成功完成了跨越大西洋的無線電通信的實驗,在全球范圍內引發轟動,推動了無線電通信時代的到來。無線電大大提高了遠程通信的能力,但是它有一個天然的缺陷——很難限制接收方,這就意味著你所傳的信息有可能被攔截,因此就催生了加密技術的發展。

對于無線電信息進行加密和解密也直接促進了近現代密碼學和計算機技術的出現。反過來這些科技進步也影響了時代的發展。一戰時期德國外交部長Arthur Zimmermann(阿瑟?齊默爾曼)拉攏墨西哥構成抗美軍事同盟的電報(1917 年1月16日)被英國情報機構—40號辦公室破譯,直接導致了美國的參戰;二戰時期德國使用的恩尼格瑪(Enigma)密碼機(當時最先進的加密設備)被盟軍成功破譯(1939年到1941年),導致大西洋戰役德國失敗。據稱,二戰時期光英國從事密碼學研究的人員就達到7000人,而他們的成果使二戰結束的時間至少提前了一到兩年時間。

接下來就是可以稱之為是密碼學發展史上里程碑的事件了。1945年9月1日,Claude Elwood Shannon(克勞德?艾爾伍德?香農)完成了劃時代的內部報告《A Mathematical Theory of Cryptography(密碼術的一個數學理論)》,1949 年 10 月,該報告以《Communication Theory of Secrecy Systems(保密系統的通信理論)》為題在 Bell System Technical Journal(貝爾系統技術期刊)上正式發表。這篇論文首次將密碼學和信息論聯系到一起,為對稱密碼技術提供了數學基礎。這也標志著近現代密碼學的正式建立。這也是密碼學發展史上的第一座里程碑性事件。

密碼學發展史上的第二個里程碑性事件是DES的出現。DES全稱為Data Encryption Standard,即數據加密標準,是一種使用密鑰加密的分組密碼算法,1977年被美國聯邦政府的國家標準局確定為聯邦資料處理標準(FIPS),并授權在非密級政府通信中使用,隨后該算法在國際上廣泛流傳開來。

密碼學發展史上的第三個里程碑性事件就是我們區塊鏈中廣泛應用的公鑰密碼,也就是非對稱密碼算法的出現。1976年11月,Whitfield Diffie 和 Martin E.Hellman 在 IEEE Transactions on Information Theory 上發表了論文《New Directions in Cryptography(密碼學的新方向)》,探討了無需傳輸密鑰的保密通信和簽名認證體系問題,正式開創了現代公鑰密碼學體系的研究。在公鑰密碼發現以前,如果需要保密通信,通信雙方事先要對加解密的算法以及要使用的密鑰進行事先協商,包括送雞毛信,實際上是在傳送密鑰。但自從有了公鑰密碼,需要進行秘密通信的雙方不再需要進行事前的密鑰協商了。公鑰密碼在理論上是不保密的,在實際上是保密的。也就是說,公鑰密碼是可以猜出來的,但需要極長的時間,等到猜出來了,這個秘密也沒有保密的必要了。

上面我們說到了關于近現代的密碼學相關的東西,基本上總結下來我們現在常用的就兩個,一個是對稱加密算法,一個是非對稱加密算法。那么接下來我們就以介紹這兩個概念為主線引出開題中我們提到的概念。

3程序實現

3.1 對稱加密算法

對稱加密指的就是加密和解密使用同一個秘鑰,所以叫做對稱加密。對稱加密只有一個秘鑰,作為私鑰。具體的算法有:DES、3DES、TDEA、Blowfish,RC5,IDEA。但是我們常見的有:DES、AES等等。

那么對稱加密的優點是什么呢?算法公開、計算量小、加密速度快、加密效率高。缺點就是秘鑰的管理和分發是非常困難的,不夠安全。在數據傳送前,發送方和接收方必須商定好秘鑰,然后雙方都必須要保存好秘鑰,如果一方的秘鑰被泄露了,那么加密的信息也就不安全了。另外,每對用戶每次使用對稱加密算法時,都需要使用其他人不知道的唯一秘鑰,這會使得收、發雙方所擁有的的鑰匙數量巨大,秘鑰管理也會成為雙方的負擔。

加密的過程我們可以理解為如下:

  • 加密:原文+秘鑰 = 密文
  • 解密:密文-秘鑰 = 原文

可以看到兩次過程使用的都是一個秘鑰。用圖簡單表示如下:

圖片

3.2實戰演練

既然我們知道關于對稱加密算法的相關知識,那么我們日常用Java如何實現對稱加密的加密和解密動作呢?常見的對稱加密算法有:DES、AES等。

3.2.1 DES

DES加密算法是一種分組密碼,以64位為分組對數據加密,它的密鑰長度是56位,加密解密用同一算法。DES加密算法是對密鑰進行保密,而公開算法,包括加密和解密算法。這樣,只有掌握了和發送方相同密鑰的人才能解讀由DES加密算法加密的密文數據。因此,破譯DES加密算法實際上就是搜索密鑰的編碼。對于56位長度的密鑰來說,如果用窮舉法來進行搜索的話,其運算次數為2的56次方。

接下來用Java實現DES加密

private final static String DES = "DES";


public static void main(String[] args) throws Exception {
String data = "123 456";
String key = "wang!@#$";
System.err.println(encrypt(data, key));
System.err.println(decrypt(encrypt(data, key), key));


}


/**
* Description 根據鍵值進行加密
* @param data
* @param key 加密鍵byte數組
* @return
* @throws Exception
*/
public static String encrypt(String data, String key) throws Exception {
byte[] bt = encrypt(data.getBytes(), key.getBytes());
String strs = new BASE64Encoder().encode(bt);
return strs;
}


/**
* Description 根據鍵值進行解密
* @param data
* @param key 加密鍵byte數組
* @return
* @throws IOException
* @throws Exception
*/
public static String decrypt(String data, String key) throws IOException,
Exception {
if (data == null)
return null;
BASE64Decoder decoder = new BASE64Decoder();
byte[] buf = decoder.decodeBuffer(data);
byte[] bt = decrypt(buf,key.getBytes());
return new String(bt);
}


/**
* Description 根據鍵值進行加密
* @param data
* @param key 加密鍵byte數組
* @return
* @throws Exception
*/
private static byte[] encrypt(byte[] data, byte[] key) throws Exception {
// 生成一個可信任的隨機數源
SecureRandom sr = new SecureRandom();


// 從原始密鑰數據創建DESKeySpec對象
DESKeySpec dks = new DESKeySpec(key);


// 創建一個密鑰工廠,然后用它把DESKeySpec轉換成SecretKey對象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
SecretKey securekey = keyFactory.generateSecret(dks);


// Cipher對象實際完成加密操作
Cipher cipher = Cipher.getInstance(DES);


// 用密鑰初始化Cipher對象
cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);


return cipher.doFinal(data);
}




/**
* Description 根據鍵值進行解密
* @param data
* @param key 加密鍵byte數組
* @return
* @throws Exception
*/
private static byte[] decrypt(byte[] data, byte[] key) throws Exception {
// 生成一個可信任的隨機數源
SecureRandom sr = new SecureRandom();


// 從原始密鑰數據創建DESKeySpec對象
DESKeySpec dks = new DESKeySpec(key);


// 創建一個密鑰工廠,然后用它把DESKeySpec轉換成SecretKey對象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
SecretKey securekey = keyFactory.generateSecret(dks);


// Cipher對象實際完成解密操作
Cipher cipher = Cipher.getInstance(DES);


// 用密鑰初始化Cipher對象
cipher.init(Cipher.DECRYPT_MODE, securekey, sr);


return cipher.doFinal(data);
}

輸出以后可以看到數據被加密了

5fiw/XhRJ0E=
123 456

在Java中用DES加密有一個特殊的地方

(1)秘鑰設置的長度必須大于等于8

(2)秘鑰設置的長度如果大于8的話,那么只會取前8個字節作為秘鑰

為什么呢,我們可以看到在初始化DESKeySpec類的時候有下面一段,其中var1是我們傳的秘鑰。可以看到他進行了截取。只截取前八個字節。

public DESKeySpec(byte[] var1, int var2) throws InvalidKeyException {
if (var1.length - var2 < 8) {
throw new InvalidKeyException("Wrong key size");
} else {
this.key = new byte[8];
System.arraycopy(var1, var2, this.key, 0, 8);
}
}

3.2.2 AES

AES加密算法是密碼學中的高級加密標準,該加密算法采用對稱分組密碼體制,密鑰長度的最少支持為128、192、256,分組長度128位,算法應易于各種硬件和軟件實現。這種加密算法是美國聯邦政府采用的區塊加密標準,AES標準用來替代原先的DES,已經被多方分析且廣為全世界所使用。

JCE,Java Cryptography Extension,在早期JDK版本中,由于受美國的密碼出口條例約束,Java中涉及加解密功能的API被限制出口,所以Java中安全組件被分成了兩部分: 不含加密功能的JCA(Java Cryptography Architecture )和含加密功能的JCE(Java Cryptography Extension)。

JCE的API都在javax.crypto包下,核心功能包括:加解密、密鑰生成(對稱)、MAC生成、密鑰協商。

加解密功能由Cipher組件提供,其也是JCE中最核心的組件。

在設置Cipher 類的時候有幾個注意點:

(1)Cipher在使用時需以參數方式指定transformation

(2)transformation的格式為algorithm/mode/padding,其中algorithm為必輸項,如: AES/DES/CBC/PKCS5Padding,具體有哪些可看下表

(3)缺省的mode為ECB,缺省的padding為PKCS5Padding

(4)在block算法與流加密模式組合時, 需在mode后面指定每次處理的bit數, 如DES/CFB8/NoPadding, 如未指定則使用缺省值, SunJCE缺省值為64bits

(5)Cipher有4種操作模式: ENCRYPT_MODE(加密), DECRYPT_MODE(解密), WRAP_MODE(導出Key), UNWRAP_MODE(導入Key),初始化時需指定某種操作模式

算法/模式/填充

16字節加密后數據長度

不滿16字節加密后長度

AES/CBC/NoPadding

16

不支持

AES/CBC/PKCS5Padding

32

16

AES/CBC/ISO10126Padding

32

16

AES/CFB/NoPadding

16

原始數據長度

AES/CFB/PKCS5Padding

32

16

AES/CFB/ISO10126Padding

32

16

AES/ECB/NoPadding

16

不支持

AES/ECB/PKCS5Padding

32

16

AES/ECB/ISO10126Padding

32

16

AES/OFB/NoPadding

16

原始數據長度

AES/OFB/PKCS5Padding

32

16

AES/OFB/ISO10126Padding

32

16

AES/PCBC/NoPadding

16

不支持

AES/PCBC/PKCS5Padding

32

16

AES/PCBC/ISO10126Padding

32

16

秘鑰的可以由我們自己定義,也可以是由AES自己生成,當自己定義是需要是要注意:

(1)根據 AES 規范,可以是 16 字節、24 字節和32 字節長,分別對應 128 位、192 位和 256 位;

(2)為便于傳輸,一般對加密后的數據進行 base64 編碼:

public static void main(String[] args) throws Exception {
/*
* 此處使用AES-128-ECB加密模式,key需要為16位。
*/
String cKey = "1234567890123456";
// 需要加密的字串
String cSrc = "buxuewushu";
System.out.println(cSrc);
// 加密
String enString = Encrypt(cSrc, cKey);
System.out.println("加密后的字串是:" + enString);


// 解密
String DeString = Decrypt(enString, cKey);
System.out.println("解密后的字串是:" + DeString);
}


// 加密
public static String Encrypt(String sSrc, String sKey) throws Exception {
if (sKey == null) {
System.out.print("Key為空null");
return null;
}
// 判斷Key是否為16位
if (sKey.length() != 16) {
System.out.print("Key長度不是16位");
return null;
}
byte[] raw = sKey.getBytes("utf-8");
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");//"算法/模式/補碼方式"
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));


return new Base64().encodeToString(encrypted);//此處使用BASE64做轉碼功能,同時能起到2次加密的作用。
}


// 解密
public static String Decrypt(String sSrc, String sKey) throws Exception {
try {
// 判斷Key是否正確
if (sKey == null) {
System.out.print("Key為空null");
return null;
}
// 判斷Key是否為16位
if (sKey.length() != 16) {
System.out.print("Key長度不是16位");
return null;
}
byte[] raw = sKey.getBytes("utf-8");
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] encrypted1 = new Base64().decode(sSrc);//先用base64解密
try {
byte[] original = cipher.doFinal(encrypted1);
String originalString = new String(original,"utf-8");
return originalString;
} catch (Exception e) {
System.out.println(e.toString());
return null;
}
} catch (Exception ex) {
System.out.println(ex.toString());
return null;
}
}

3.3 非對稱加密算法

非對稱加密算法中加密和解密用的不是同一個秘鑰,所以叫作非對稱加密算法。在非對稱加密算法每個用戶都有兩把鑰匙,一把公鑰一把私鑰。公鑰是對外發布的,所有人都看的到所有人的公鑰,私鑰是自己保存,每個人都只知道自己的私鑰而不知道別人的。而也正是在非對稱加密算法中有加密和解密、加簽和驗簽的概念。接下來我們解釋一下這幾個概念是什么意思。

3.3.1 加密和解密

用該用戶的公鑰加密后只能該用戶的私鑰才能解密。這種情況下,公鑰是用來加密信息的,確保只有特定的人(用誰的公鑰就是誰)才能解密該信息。所以這種我們稱之為加密和解密。

下面我拿A銀行和小明來舉例子吧。假設這2者之間是用不對稱的加密算法來保證信息傳輸的安全性(不被第三人知道信息的含義及篡改信息)。大致流程如下:首先小明發了一條信息給A銀行“我要存500元”。這條信息小明會根據A銀行的對外發布的公鑰把這條信息加密了,加密之后,變成“XXXXXXX”發給A銀行。中間被第三者截獲,由于沒有A銀行的私鑰無法解密,不能知道信息的含義,也無法按正確的方式篡改。所以拿這條加密信息是沒辦法的。最后被A銀行接受,A銀行用自己的私鑰去解密這條信息,解密成功,讀取內容,執行操作。然后得知消息是小明發來的,便去拿小明的公鑰,把“操作成功(或失敗)”這條信息用小明的公鑰加密,發給小明。同理最后小明用自己的私鑰解開,得知知乎發來的信息內容。其他人截獲因為沒有小明的私鑰所以也沒有用。

3.3.2 加簽和驗簽

還有第二種情況,公鑰是用來解密信息的,確保讓別人知道這條信息是真的由我發布的,是完整正確的。接收者由此可知這條信息確實來自于擁有私鑰的某人,這被稱作數字簽名,公鑰的形式就是數字證書。所以這種我們稱之為加簽和驗簽。

繼續拿小明和銀行A舉例子。銀行A發布了一個銀行客戶端的補丁供所有用戶更新,那為了確保人家下載的是正確完整的客戶端,銀行A會為這個程序打上一個數字簽名(就是用銀行A的私鑰對這個程序加密然后發布),你需要在你的電腦里裝上銀行A的數字證書(就是銀行對外發布的公鑰),然后下載好這個程序,數字證書會去解密這個程序的數字簽名,解密成功,補丁得以使用。同時你能知道這個補丁確實是來自這個銀行A,是由他發布的,而不是其他人發布的。

3.3.3 實戰演練

我們在開發過程中經常使用的非對稱加密算法之一就是RSA算法。接下來我們使用Java實現RSA算法。

生成密鑰

首先是生成key的部分,生成key有好多種做法,這里我介紹三種

(1)命令行:可以使用openssl進行生成公鑰和私鑰

-- 生成公鑰和私鑰
openssl genrsa -out key.pem 1024
-out 指定生成文件,此文件包含公鑰和私鑰兩部分,所以即可以加密,也可以解密
1024 生成密鑰的長度

(2)使用網站:生成密鑰的網站

(3)使用代碼:可以指定生成密鑰的長度,最低是512

public static KeyPair buildKeyPair() throws NoSuchAlgorithmException {
final int keySize = 2048;
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(RSA_ALGORITHM);
keyPairGenerator.initialize(keySize);
return keyPairGenerator.genKeyPair();
}
加密

有了密鑰,就可以進行加密的操作了,接下來就介紹關于RSA的加密操作,非常簡單只要傳進來公鑰和需要加密的數據即可。

--- 加密
public static byte[] encrypt(PublicKey publicKey, String message) throws Exception {
Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, publicKey);


return cipher.doFinal(message.getBytes(UTF8));
}
解密
--- 解密
public static byte[] decrypt(PrivateKey privateKey, byte [] encrypted) throws Exception {
Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, privateKey);


return cipher.doFinal(encrypted);
}

加簽

/**
* 使用RSA簽名
*/
private static String signWithRSA(String content, PrivateKey privateKey) throws Exception {
Signature signature = Signature.getInstance("SHA1WithRSA");
signature.initSign(privateKey);
signature.update(content.getBytes("utf-8"));
byte[] signed = signature.sign();
return base64Encode(signed);
}
驗簽
/**
* 使用RSA驗簽
*/
private static boolean checkSignWithRSA(String content, PublicKey publicKey,String sign) throws Exception {
Signature signature = Signature.getInstance("SHA1WithRSA");
signature.initVerify(publicKey);
signature.update(content.getBytes("utf-8"));
return signature.verify(base64Decode(sign));
}

在加簽驗簽的時候需要傳入一個數字簽名標準,我們這里填的是SHA1WithRSA ,它的意思是用SHA算法進行簽名,用RSA算法進行加密。

算法說明:在對進行SHA1算法進行摘要計算后,要求對計算出的摘要進行處理,而不是直接進行RSA算法進行加密。要求把SHA1摘要的數據進行壓縮到20個字節。在前面插入15個字節標示數據。所以結構如下

30(數據類型結構)21(總長度)30(數據類型)09(長度)06 05 2B 0E 03 02 1A 0500【數據具體類型不清楚-請專家指正】 04 (數據類型) 14 (長度) + SHA1簽名數據

最后進行RSA加密。所以我們填寫的XXXWithRSA,這個XXX代表的就是使用什么摘要算法進行加簽,至于摘要算法是什么,隨后會有詳細的說明。

調用實驗一下

public static void main(String[] args) throws Exception {
KeyPair keyPair = buildKeyPair();


byte[] encryptData = encrypt(keyPair.getPublic(), "不學無數");


System.out.println(String.format("加密后的數據:%s",base64Encode(encryptData)));


System.out.println(String.format("解密后的數據:%s",new String(decrypt(keyPair.getPrivate(),encryptData),UTF8)));


String context = "加簽的字符串";


String sign = signWithRSA(context, keyPair.getPrivate());


System.out.println(String.format("生成的簽名:%s",sign));


Boolean checkSignWithRSA = checkSignWithRSA(context, keyPair.getPublic(), sign);


System.out.println(String.format("校驗的結果:%s",checkSignWithRSA.toString()));
}

輸出為

加密后的數據:Bi8b4eqEp+rNRhDaij8vVlNwKuICbPJfFmyzmEXKuAgEgzMPb8hAmYiGN+rbUKWeZYJKJd0fiOXv
6YrYqd7fdast/m443qQreRLxdQFScwvCvj9g1YnPzbU2Q/jIwqAPopTyPHNNngBmFki+R/6V4DYt
HA5gniaUMYzynHdD+/W+x8ZYmwiuuS63+7wXqL36aLKe0H50wELOpSn45Gvni8u+5zPIoHV7PBiz
trCnQvne5LxFKDprrS3td1/76qyupFd+Ul3hsd+gjbAyN2MlXcAFMrGVaRkopWwc9hP1BsPvS52q
/8jOVdbeyU9BziVhViz1V0TtGW8bfbEnIStc3Q==
解密后的數據:不學無數
生成的簽名:wvUXtr2UI0tUXmyMTTUBft8oc1dhvtXSBrFFetI5ZoxMm91TbXRWD31Pgqkg72ADxx9TEOAM3Bm1
kyzfBCZZpoq6Y9SM4+jdJ4sMTVtw0wACPglnPDAGs8sG7nnLhXWNQ1Y4pl4ziY6uLxF1TzQLFTxu
NAS7nyljbG69wrb9R3Sv5t8r1I54rYCVGSVFmTrGf+dSCjxABZv6mH8nygVif7zN1vU1+nSDKcON
Vtrpv0xCQHVBqnHPA6OiDm5GzBQxjD5aQt8mfgv8JJrB52TEa4JPYoC5Zw4JHlL++OvPwMpJgnuG
yg5vnWhxE2ncTzM+/pZ+CnXF2Dqv/JMQOfX6tA==
校驗的結果:true

4摘要算法

數據摘要算法是密碼學算法中非常重要的一個分支,它通過對所有數據提取指紋信息以實現數據簽名、數據完整性校驗等功能,由于其不可逆性,有時候會被用做敏感信息的加密。數據摘要算法也被稱為哈希(Hash)算法或散列算法。

消息摘要算法的主要特征是加密過程不需要密鑰,并且經過加密的數據無法被解密,只有輸入相同的明文數據經過相同的消息摘要算法才能得到相同的密文。(摘要可以比方為指紋,消息摘要算法就是要得到文件的唯一職位)

4.1 特點

無論輸入的消息有多長,計算出來的消息摘要的長度總是固定的。一般地,只要輸入的消息不同,對其進行摘要以后產生的摘要消息也必不相同;但相同的輸入必會產生相同的輸出。只能進行正向的信息摘要,而無法從摘要中恢復出任何的消息,甚至根本就找不到任何與原信息相關的信息(不可逆性)。

好的摘要算法,沒有人能從中找到“碰撞”或者說極度難找到,雖然“碰撞”是肯定存在的(碰撞即不同的內容產生相同的摘要)。

4.2 應用

一般地,把對一個信息的摘要稱為該消息的指紋或數字簽名。數字簽名是保證信息的完整性和不可否認性的方法。數據的完整性是指信宿接收到的消息一定是信源發送的信息,而中間絕無任何更改;信息的不可否認性是指信源不能否認曾經發送過的信息。其實,通過數字簽名還能實現對信源的身份識別(認證),即確定“信源”是否是信宿意定的通信伙伴。數字簽名應該具有唯一性,即不同的消息的簽名是不一樣的;同時還應具有不可偽造性,即不可能找到另一個消息,使其簽名與已有的消息的簽名一樣;還應具有不可逆性,即無法根據簽名還原被簽名的消息的任何信息。這些特征恰恰都是消息摘要算法的特征,所以消息摘要算法適合作為數字簽名算法。

有哪些具體的消息摘要算法?

  • CRC8、CRC16、CRC32:CRC(Cyclic Redundancy Check,循環冗余校驗)算法出現時間較長,應用也十分廣泛,尤其是通訊領域,現在應用最多的就是 CRC32 算法,它產生一個4字節(32位)的校驗值,一般是以8位十六進制數,如FA 12 CD 45等。CRC算法的優點在于簡便、速度快,嚴格的來說,CRC更應該被稱為數據校驗算法,但其功能與數據摘要算法類似,因此也作為測試的可選算法。
  • MD2 、MD4、MD5:這是應用非常廣泛的一個算法家族,尤其是 MD5(Message-Digest Algorithm 5,消息摘要算法版本5),它由MD2、MD3、MD4發展而來,由Ron Rivest(RSA公司)在1992年提出,目前被廣泛應用于數據完整性校驗、數據(消息)摘要、數據加密等。MD2、MD4、MD5 都產生16字節(128位)的校驗值,一般用32位十六進制數表示。MD2的算法較慢但相對安全,MD4速度很快,但安全性下降,MD5比MD4更安全、速度更快。
  • SHA1、SHA256、SHA384、SHA512:SHA(Secure Hash Algorithm)是由美國專門制定密碼算法的標準機構——美國國家標準技術研究院(NIST)制定的,SHA系列算法的摘要長度分別為:SHA為20字節(160位)、SHA256為32字節(256位)、 SHA384為48字節(384位)、SHA512為64字節(512位),由于它產生的數據摘要的長度更長,因此更難以發生碰撞,因此也更為安全,它是未來數據摘要算法的發展方向。由于SHA系列算法的數據摘要長度較長,因此其運算速度與MD5相比,也相對較慢。
  • RIPEMD、PANAMA、TIGER、ADLER32 等: RIPEMD是Hans Dobbertin等3人在對MD4,MD5缺陷分析基礎上,于1996年提出來的,有4個標準128、160、256和320,其對應輸出長度分別為16字節、20字節、32字節和40字節。TIGER由Ross在1995年提出。Tiger號稱是最快的Hash算法,專門為64位機器做了優化。

4.3 實戰演練

在單獨的使用摘要算法時我們通常使用的MD5算法,所以我們這里就單獨說明使用Java實現MD5算法。

public static String getMD5Str(String str) throws Exception {
try {
// 生成一個MD5加密計算摘要
MessageDigest md = MessageDigest.getInstance("MD5");
// 計算md5函數
md.update(str.getBytes());
// digest()最后確定返回md5 hash值,返回值為8為字符串。因為md5 hash值是16位的hex值,實際上就是8位的字符
// BigInteger函數則將8位的字符串轉換成16位hex值,用字符串來表示;得到字符串形式的hash值
return new BigInteger(1, md .digest()).toString(16);
} catch (Exception e) {
throw new Exception("MD5加密出現錯誤,"+e.toString());
}
}

5參考文章

  • https://zhuanlan.zhihu.com/p/20064358
  • https://time.geekbang.org/column/article/224701
  • https://my.oschina.net/OutOfMemory/blog/3131916
  • https://www.zz-news.com/com/zhongshanfengyu/news/itemid-674743.html
  • https://www.hbhncj.com/article-53-3443-1.html
  • https://www.zhihu.com/question/33645891
責任編輯:武曉燕 來源: 得物技術
相關推薦

2020-07-20 07:46:01

程序員加簽驗簽

2020-04-14 11:43:54

Python加密解密授權認證

2021-12-27 16:20:45

鴻蒙HarmonyOS應用

2012-05-01 08:06:49

手機

2021-12-07 00:10:25

C# 微信支付

2012-07-13 00:03:08

WEB前端開發WEB開發

2019-12-10 08:00:46

Kata容器Linux

2015-08-13 10:54:46

2015-09-14 09:28:47

2021-03-18 16:05:20

SSD存儲故障

2009-02-19 10:21:00

路由多WAN口

2024-01-01 09:08:52

API簽名驗簽

2012-01-02 19:30:22

iPad

2011-08-22 16:42:43

SqliteiPad

2011-08-01 17:31:25

Xcode開發 Cocoa

2011-07-04 13:51:02

QT 對象 模型

2011-06-30 10:59:43

2022-09-09 08:08:28

開源項目服務

2011-07-19 15:33:57

iPhone

2012-04-05 10:49:40

服務器SSL證書
點贊
收藏

51CTO技術棧公眾號

欧美日韩你懂得| a级黄色免费视频| 欧美成人片在线观看| 爱看av在线| 精品在线播放视频| 欧美在线观看在线观看| 亚洲精品中文字幕乱码| 91丝袜国产在线播放| 在线播放日韩精品| 嫩草影院中文字幕| 一卡二卡三卡在线| 国产精品一区二区三区av麻| 亚洲一区二区三区视频在线 | h片在线播放| 亚洲欧美清纯在线制服| 精品日韩欧美在线| 一区二区三区欧美成人| 日韩免费av网站| 免费观看不卡av| 色偷偷成人一区二区三区91 | 国产特黄一级片| 国内黄色精品| 91精品国产综合久久久久久漫画 | 亚洲一区二区精品3399| 日本一区二区三区精品视频| av大片免费在线观看| 操欧美老女人| 欧美色视频在线观看| 欧美专区一二三| 午夜精品久久久久久久第一页按摩| 色婷婷综合网| 91精品欧美久久久久久动漫| 日本熟妇人妻xxxxx| 欧美女v视频| 亚洲黄色三级| 精品在线欧美视频| 免费av网址在线| 国产人成在线视频| 日本视频中文字幕一区二区三区| 国产亚洲精品激情久久| 一区二区xxx| av资源网在线观看| 九一九一国产精品| 久久999免费视频| 国内自拍偷拍视频| 亚洲欧美se| 欧美激情一区二区在线| 成人福利在线视频| 一区二区视频免费看| 亚洲一区 二区| 欧美视频在线观看免费| 性欧美.com| 精品国产亚洲一区二区麻豆| 蜜桃视频免费观看一区| 欧美成人黑人xx视频免费观看| 高清中文字幕mv的电影| 日韩成人动漫| 亚洲免费视频成人| 狠狠色狠狠色综合人人| 真实的国产乱xxxx在线91| 在线亚洲a色| 欧洲生活片亚洲生活在线观看| 中文字幕欧美人与畜| 亚洲精品一区二区三区不卡| 久久久久久久高潮| 欧美日韩国产va另类| 日本aⅴ在线观看| 欧美午夜一区| 中文字幕精品网| 一级黄色大片免费看| 日韩欧美中文字幕在线视频| 欧美性猛交xxxx| 久久久久久久久久久免费视频| 亚洲综合电影| 一区二区免费视频| 色一情一乱一伦一区二区三欧美| 偷拍自拍在线| 国产一区二区三区久久悠悠色av| 1769国内精品视频在线播放| 永久免费看片直接| 亚洲日本三级| 一区二区三区四区视频| 天堂av免费在线| 亚洲成人一品| 亚洲一区二区黄| 中文乱码字幕高清一区二区| 欧美久久99| 国产91精品久久久久| 久热这里有精品| 在线看片一区| 欧美大秀在线观看| 国产小视频你懂的| 在线播放不卡| 国产精品成av人在线视午夜片| 久久机热这里只有精品| 精品美女在线视频| 日韩精品免费在线视频| 国产在线a视频| 亚洲最大的免费视频网站| 色噜噜夜夜夜综合网| 欧美午夜性视频| 性欧美高清come| 最新成人av在线| 亚洲国产一区二区三区在线播| 欧美色图另类| 亚洲欧美日韩国产综合在线| 色噜噜一区二区| 在线观看中文| 一区二区三区毛片| 女人另类性混交zo| 91国内精品白嫩初高生| 综合136福利视频在线| 唐朝av高清盛宴| 日韩精品视频网| 日本成人在线视频网址| 亚洲婷婷综合网| 国产精品腿扒开做爽爽爽挤奶网站| 久久久久久国产精品美女| 欧美极品aaaaabbbbb| 日韩主播视频在线| 精品国产乱码一区二区三区四区| 求av网址在线观看| 18欧美亚洲精品| 无码人妻丰满熟妇区毛片| 99精品中文字幕在线不卡| 亚洲精品一区二区在线观看| 伊人久久一区二区三区| 狠狠久久伊人| 日韩av在线免费观看一区| 美国一级片在线观看| 久久一区二区三区超碰国产精品| 国产精品久久久久久影视| 亚洲精品国产精品乱码视色| 不卡av在线免费观看| 久久国产精品一区二区三区四区| 久草福利在线| 国产精品久久久一本精品| 国产日韩视频在线播放| 日本色护士高潮视频在线观看 | 久久视频在线看| 内射一区二区三区| 欧美日韩国产精品一区二区亚洲| 国产精品久久久久影院日本| 青青国产在线| 黑人欧美xxxx| 污片在线免费看| 狠狠色丁香婷婷综合影院| 热re99久久精品国产66热| 天天干视频在线| 欧美经典一区二区| 六月丁香婷婷在线| 久久99国产精品视频| 日本成人精品在线| 福利视频在线播放| 欧美私人免费视频| 中国黄色片视频| 黄色日韩在线| 国产精品亚洲激情| 亚洲精品久久久蜜桃动漫| 一区二区三区在线高清| 日本xxxxxxx免费视频| 日韩丝袜视频| 久久成人国产精品| av网站免费大全| 久久久久久久久久久黄色| 强开小嫩苞一区二区三区网站| 色综合亚洲图丝熟| 日韩一区二区三区在线| 一区二区不卡免费视频| 亚洲电影在线一区二区三区| 欧美在线性视频| 黄色av网站在线| 欧美日韩精品系列| 免费国产羞羞网站美图| 国产精品一区二区你懂的| 日韩高清三级| 美女网站在线看| 亚洲欧洲午夜一线一品| 久久精品国产亚洲AV无码男同 | 做a视频在线观看| 欧美大胆视频| 久久成人精品电影| 色综合免费视频| 在线免费观看一区| 18岁成人毛片| 91麻豆产精品久久久久久 | 一二区成人影院电影网| 精品成人一区二区| 黄色在线视频网址| 日韩一区在线免费观看| 国产精品入口麻豆| 蜜臀av亚洲一区中文字幕| mm131午夜| 亚洲bt欧美bt精品777| 国产在线拍揄自揄视频不卡99| 亚洲av成人无码网天堂| 亚洲人成网站精品片在线观看 | 日本三级一区二区三区| 亚洲码国产岛国毛片在线| 粉嫩av懂色av蜜臀av分享| 欧美精品三区| 欧美一区二区视频17c| 久久wwww| 久久成人综合视频| 婷婷亚洲一区二区三区| 欧美一区午夜精品| 日韩精品一区二区亚洲av性色| 成人动漫一区二区| 99九九99九九九99九他书对| 亚洲视频1区| 在线亚洲高清视频| 国产91精品不卡视频| 免费黄色在线网址| 成人福利网站| 日韩成人av在线播放| 91精品视频免费在线观看| 精品国产成人在线| 无码一区二区精品| 一区二区三区国产在线| 精品免费日产一区一区三区免费| 懂色aⅴ精品一区二区三区| 一区二区三区在线播放欧美| 亚洲精品国偷拍自产在线观看蜜桃| 色综合久久久久综合体桃花网| 精品视频久久久久| av午夜一区麻豆| 免费看一级大黄情大片| 亚洲老女人视频免费| 亚洲最大av网| 白浆视频在线观看| 亚洲精品一区中文字幕乱码| 国产成人免费看一级大黄| 欧美人体做爰大胆视频| 久久精品国产亚洲av麻豆蜜芽| 天天影视网天天综合色在线播放| 青青草原在线免费观看| 中文字幕乱码久久午夜不卡 | 国内在线观看一区二区三区| 亚洲精品在线免费| 成人3d精品动漫精品一二三| 欧美精品久久久| 日韩欧美一区二区三区在线观看| 午夜精品理论片| 国产中文字幕在线视频| 亚洲精品电影在线| 国产情侣小视频| 成人免费在线播放视频| 国产日产在线观看| 国产精品青草久久| 亚洲欧美日韩第一页| 中文字幕欧美区| 手机看片国产日韩| 亚洲欧洲在线观看av| 疯狂撞击丝袜人妻| 亚洲精品亚洲人成人网| 欧美丰满艳妇bbwbbw| 亚洲一区日韩精品中文字幕| 久久午夜无码鲁丝片午夜精品| 亚洲精品一二三| 日韩精品视频免费看| 国产精品区一区二区三区| 极品尤物一区二区| 中文字幕中文字幕一区| 少妇一级淫片免费放播放| av在线综合网| 亚洲自拍偷拍图| 顶级嫩模精品视频在线看| 亚洲精品无码久久久久久| 免费国产自线拍一欧美视频| 日本在线观看a| 蜜桃久久久久久久| 中文字幕欧美视频| 奇米四色…亚洲| 久久久久久久久久久久久久久国产| 国产在线不卡视频| 亚洲精品乱码久久久久久蜜桃图片| 91视频在线看| 色撸撸在线视频| 一区二区在线免费| 成年人免费高清视频| 亚洲综合在线第一页| 偷偷操不一样的久久| 欧美伊人久久大香线蕉综合69| 国产精品爽爽久久| 欧美视频在线观看一区| 国产高清在线观看视频| 日韩电影免费观看中文字幕| 天天影视久久综合| 国产一区二区动漫| 成人video亚洲精品| 性日韩欧美在线视频| 素人一区二区三区| 日韩免费精品视频| 中文一区一区三区高中清不卡免费| 欧美在线免费观看| 成人影院网站ww555久久精品| 国产精品第10页| 久久爱www.| 欧美午夜视频在线| 欧美激情无毛| 三级在线免费看| 奇米综合一区二区三区精品视频| 亚洲丝袜在线观看| 国产午夜精品一区二区三区视频 | 成人毛片在线播放| 亚洲自拍偷拍麻豆| 亚洲天堂视频在线播放| 精品久久久久一区二区国产| av在线电影观看| 久久久久亚洲精品| 福利在线导航136| 国产精品久久久久久久久免费 | 久久av一区二区三区漫画| 999精品一区| 亚洲欧洲中文| 亚洲麻豆一区| 免费不卡av网站| 欧美国产综合一区二区| 国产精品500部| 欧美成人bangbros| 免费人成在线观看播放视频| 日本高清不卡的在线| 成人高潮视频| 穿情趣内衣被c到高潮视频| 男女性色大片免费观看一区二区| 51调教丨国产调教视频| 亚洲综合图片区| 亚洲天堂网在线观看视频| 欧美久久婷婷综合色| 国产叼嘿视频在线观看| 色噜噜亚洲精品中文字幕| 黄色网页在线播放| 欧美激情videoshd| 3d动漫一区二区三区在线观看| 欧美一区二区三区电影在线观看 | 久久免费视频在线观看| 国产成年精品| 中文字幕一区二区三区在线乱码 | 人妻少妇一区二区三区| 国产视频一区在线| 91九色porn在线资源| 国产第一区电影| 国产乱码精品一区二区三区亚洲人| 日韩精彩视频| 日韩高清在线不卡| 男女做爰猛烈刺激| 亚洲视频资源在线| 一区二区三区www污污污网站| 伊人久久精品视频| 国产精品伦一区二区| 91嫩草国产在线观看| 都市激情亚洲| 日韩一区二区三区高清| 玖玖视频精品| av男人的天堂av| 欧美色电影在线| 69av亚洲| 97超级碰碰碰| 婷婷综合电影| 欧美三级午夜理伦三级| 国产欧美精品一区| 真实新婚偷拍xxxxx| 日韩色av导航| 天堂√8在线中文| 欧美凹凸一区二区三区视频| 一区二区电影在线观看| a级大片免费看| 亚洲国产一区二区视频| 亚洲 另类 春色 国产| 热久久这里只有精品| 日本午夜一区| 国产乱码一区二区三区四区| 一区二区三区不卡在线观看| 色丁香婷婷综合久久| 国产盗摄xxxx视频xxx69| 久久久久久久久久久妇女| 色哟哟视频在线| 色综合久久99| 黄色动漫在线观看| 国产精品一区二区三区免费观看 | 亚洲色图激情小说| 久久亚洲精品人成综合网| 欧美 日韩 国产精品| 另类小说综合欧美亚洲| 色无极影院亚洲| 午夜激情一区二区三区| www国产在线| 欧美主播福利视频| 外国成人激情视频| 艹b视频在线观看| 久久伊人蜜桃av一区二区| 久久99久久久| 亚洲欧美日韩国产精品| 俄罗斯一级**毛片在线播放| 久久伊人资源站| 久久国产精品99精品国产| 国产香蕉在线视频| 深夜福利亚洲导航| 欧美电影在线观看免费| av网站在线不卡|