標籤:
訊息摘要簡單介紹
訊息摘要演算法的主要特徵是加密過程不需要密鑰,並且經過加密的資料無法被解密,只有輸入相同的明文資料經過相同的訊息摘要演算法才能得到相同的密文。訊息摘要演算法不存在密鑰的管理與分發問題,適合於分布式網路相同上使用。由於其加密計算的工作量相當可觀,所以以前的這種演算法通常只用於資料量有限的情況下的加密,例如電腦的口令就是用無法復原密碼編譯演算法加密的。近年來,隨著電腦相同效能的飛速改善,加密速度不再成為限制這種加密技術發展的桎梏,因而訊息摘要演算法應用的領域不斷增加。現在,訊息摘要演算法主要應用在“數位簽章”領域,作為對明文的摘要演算法。著名的摘要演算法有RSA公司的MD5演算法和SHA-1演算法及其大量的變體。訊息摘要返回的這些位元看上去是胡亂的雜湊在一起的。可以用大量的輸入來檢驗其輸出是否相同,一般,不同的輸入會有不同的輸出,而且輸出的摘要訊息可以通過隨機性檢驗。但是,一個摘要並不是真正隨機的,因為用相同的演算法對相同的訊息求兩次摘要,其結果必然相同;而若是真正隨機的,則無論如何都是無法重現的。因此訊息摘要是“偽隨機的”。
預知專業的演算法介紹,需參考專業書籍。
找出系統支援的訊息摘要演算法
package date0803;/** * 找出系統支援的訊息摘要演算法 */import java.security.Security;public class PrintMessageDigestAlgorithmsAvailable {public static void main(String[] args) {System.out.println("---------系統支援的訊息摘要演算法有--------"); for (String s : Security.getAlgorithms("MessageDigest")) { System.out.println(s); }}}
支援的演算法有:
---------系統支援的訊息摘要演算法有--------SHA-384SHA-224SHA-256MD2SHASHA-512MD5
擷取訊息摘要的線程建立
package date0803;/** * 編寫一個程式來計算檔案的訊息摘要 * 使用線程,便於批次運算檔案的訊息摘要 * @author zzw922cn */import java.io.FileInputStream;import java.io.IOException;import java.security.DigestInputStream;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import javax.xml.bind.DatatypeConverter;public class FileDigestThread extends Thread {private String filename;/** * * @param filename 檔案名稱 */public FileDigestThread(String filename) {super();this.filename = filename;}/** * 線程的主要方法 */@Overridepublic void run() {try {//檔案輸入資料流FileInputStream fileInputStream = new FileInputStream(filename);//指定演算法,建立訊息摘要的單例MessageDigest instance = MessageDigest.getInstance("SHA");//MessageDigest instance = MessageDigest.getInstance("SHA-512");//MessageDigest instance = MessageDigest.getInstance("SHA-384");//MessageDigest instance = MessageDigest.getInstance("SHA-256");//MessageDigest instance = MessageDigest.getInstance("SHA-224");//MessageDigest instance = MessageDigest.getInstance("MD5");//MessageDigest instance = MessageDigest.getInstance("MD2");//建立摘要輸入資料流,即從特定輸入資料流和訊息摘要來建立DigestInputStream digestInputStream = new DigestInputStream(fileInputStream, instance);//讀取位元組,並且更新摘要,然後關閉流while(digestInputStream.read()!=-1);digestInputStream.close();//當所有資料已被更新,調用digest()方法完成雜湊計算,返回位元組數組byte[] digest = instance.digest();//建立字串構造器,方便字串的操作StringBuilder stringBuilder = new StringBuilder(filename);String algorithm = instance.getAlgorithm();stringBuilder.append("(algorithm:"+algorithm+"):");//將位元組數組轉化成字串stringBuilder.append(DatatypeConverter.printHexBinary(digest));//列印訊息摘要結果System.out.println(stringBuilder.toString());}catch(IOException ex) {System.err.println(ex);} catch (NoSuchAlgorithmException ex) {System.err.println(ex);}}}
運行執行個體
package date0803;import java.io.File;public class Test1 {public static void main(String[] args) {File file = new File("E:\\資料採礦課程PPT");File[] listFiles = file.listFiles();//對於檔案,使用絕對路徑,便於尋找for(File subfile:listFiles) {String absolutePath = subfile.getAbsolutePath();Thread fileDigestThread = new FileDigestThread(absolutePath);fileDigestThread.start();}}}
運行結果
E:\資料採礦課程PPT\4LANG.pdf(algorithm:SHA):175561E04F5A14DE82A5557C0EA036831EA5633AE:\資料採礦課程PPT\1intro.pdf(algorithm:SHA):0F8D1449BA7C195BF7AAADC1351ED02882F7B579E:\資料採礦課程PPT\3PREP.pdf(algorithm:SHA):C85278213C0D649355870E6D637D5198DD73B33BE:\資料採礦課程PPT\5DESC.pdf(algorithm:SHA):58A7F200CDDDA44D09E1F5514C8AA279E3E6E3FEE:\資料採礦課程PPT\2dw.pdf(algorithm:SHA):15D08FD207C2A680A529C7C18D847CC455E2080AE:\資料採礦課程PPT\7CLASS.pdf(algorithm:SHA):61CEB6DA12E75AF81EE84B15CBE2E4D23782993BE:\資料採礦課程PPT\8CLST.pdf(algorithm:SHA):B6AFE6FC67EE89E89860B7CF13B9550B9DCDF4FEE:\資料採礦課程PPT\10APPL.pdf(algorithm:SHA):8C6429D5A1DB0D8CE4DF8D9933C2A08FE0065976E:\資料採礦課程PPT\6ASSO.pdf(algorithm:SHA):4D04780EBB487C1AA014C631A5E5CB5305E6EE31E:\資料採礦課程PPT\9CMPLX.pdf(algorithm:SHA):B135431328FDC5ABC965C01B0FD126C21533F5EB
運用Java擷取訊息摘要