|
MD5Przegląd algorytmu MD5Funkcja dotyczy informacji(wiadomość)Generuj skróty informacyjne(skrót wiadomości), streszczenie jest unikalne dla informacji,Może być używany jako podpis cyfrowy. Używany do weryfikacji ważności dokumentu(Czy dane zostały utracone lub uszkodzone),Przy szyfrowaniu hasła użytkownika, wartość skrótu oblicza się w funkcji skrótu. Wprowadź ciąg bajtów dowolnej długości, aby go wygenerować128Całkowita liczba bitu. Dzięki nieodwracalnym cechom algorytmu, posiada on dobre zabezpieczenia w zastosowaniach szyfrowania. orazMD5Korzystanie z algorytmów nie wymaga opłacenia żadnych opłat za prawa autorskie. Ani jednoznaczność, ani nieodwracalność nie są absolutne, teoretycznie analizując ją jako zależność wielu-do-jednego, ale prawdopodobieństwo, że dwa różne informacje przyniosą to samo podsumowanie, jest niewielkie. Nieodwracalność oznacza, że ilość obliczeń i czasu obliczeń potrzebna do wywnioskowania danych wejściowych z wyjścia jest zbyt duża, a metoda wyszukiwania słowników wymaga zbyt dużej przestrzeni pamięci. SiećSystemPomysły projektowe System ten opiera się na Java Web, oraz z pomocąStrut2by to osiągnąć. Podstawowa idea projektu to zdanieWebdo dwukrotnego obliczania pliku w pamięci zewnętrznej systemuMD5i porównaj, jeśli jest to ten sam plik, nie został zmodyfikowany, jeśli jest inny, oznacza to, że plik został zmodyfikowany. SiećSystem odporny na manipulacje plikami wersji, szczegółowe pomysły na projekt: zatwierdzonyJSPPobierz plik, który trzeba obliczyć w pamięci zewnętrznej systemu.JSPPo poddaniu się pasujeStrut2ofDziałaniaPrzejdź do z wartościamiJavawarstwa logiczna. na warstwie logicznejDziałaniaŚredni sygnałDAOmetody,DAOObliczenie jest zamknięte w kapsuliMD5wartości.DaoMetodaJSPDokumenty, które przychodzą do mnie, i kalkulatoryMD5Po zakończeniu obliczeń zwróć oryginalną ścieżkę wartościDziałaniaTo pierwszy raz, gdy obliczono plikMD5Wartości, zapisz ją wSesja, tak aby można ją było porównać z drugąMD5Wartości. Po pierwszym udanym wykonaniu przejdź doSukcesPage. Teraz zacznij drugi raz plikuMD5Obliczenia, również metodą powyższą. Po obliczeniachMD5Po wyznaczeniu wartości oblicza się drugi czasMD5Wartość jest taka sama jak pierwsza obliczona i jest zapisana wSesjaJeśli wartości są takie same, nie ma żadnej zmiany. Jeśli jest inny, oznacza to, że został zmanipulowany. Implementacja systemu Krok 1,Index.jspKod źródłowy w <!-- Index.jspDodaj pliki z pamięci systemowej tutaj--> <center> <form action="fileCrypt" method="get"> <table> <tr> <td>Nazwa pliku</td>: <td><typ wejścia="nazwa pliku="Md5FilesEntity.filename" /> </td> <td><typ wejścia=wartość "wyślij" = "start" /> </td> </tr> </table> </form> </center> Krok 2,KolumnyKod źródłowy w pliku konfiguracyjnym <!-- struty2Pliki konfiguracyjne--> <struts> <stała wartość="true" nazwa="struts.devMode" /> <stała wartość="zh_CN" nazwa="struts.locale" /> <stała wartość="utf-8" nazwa="struts.i18n.encoding" /> <nazwa pakietu="default" extends="struts-default"> <nazwa akcji="mdeAction" class="com.crypt.action.mdeAction" method="codeCrype"> <nazwa wyniku="sukces">/index.jsp</result> </action> <nazwa akcji="fileCrypt" class="com.crypt.action.FilesCryptAction"> <nazwa wyniku="sukces">/success.jsp</result> </action> <nazwa akcji="fileCrypt2" class="com.crypt.action.FilesCryptAction" metoda="SetCrypt2"> <nazwa wyniku="sukces">/FilnallySuccess.jsp</result> <nazwa wyniku="fail">/fail.jsp</result> </action> </struts> Trzecim krokiem jest przejście do FilesCryptAction po struts2 pakiet com.crypt.action; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpHttpSession; import org.apache.struts2.ServletActionContext; import com.crypt.dao.Md5_dao; import com.opensymphony.xwork2.ActionSupport; import com.crypt.entity.Md5FilesEntity; public class FilesCryptAction rozszerza ActionSupport { prywatny Md5FilesEntity Md5FilesEntity = nowy Md5FilesEntity(); HttpServletRequest request = ServletActionContext.getRequest(); HttpSession = request.getSession(); public Md5FilesEntity getMd5FilesEntity() { return Md5FilesEntity; } public void setMd5FilesEntity(Md5FilesEntity md5FilesEntity) { Md5FilesEntity = md5FilesEntity; } public String execute() rzuca IOException { String fileCode = null; try { fileCode = Md5_dao.getFileCode("e:" + Md5FilesEntity.getFilename()); session.setAttribute("fileCode", fileCode); //Za pierwszym razem to obliczonoMD5Wartość jest tymczasowo zapisywana wSesjaŚredni } catch (Wyjątek e) { Automatycznie generowany blok chwytu TODO e.printStackTrace(); } Md5FilesEntity.setFileAfterHashCode1(fileCode); zwrot "sukcesu"; } public String SetCrypt2() { String fileCode2 = null; try { fileCode2 = Md5_dao .getFileCode("e:" + Md5FilesEntity.getFilename()); } catch (Wyjątek e) { Automatycznie generowany blok chwytu TODO e.printStackTrace(); } Md5FilesEntity.setFileAfterHashCode2(fileCode2); System.out.println("session1"+session.getAttribute("fileCode")); if (fileCode2 .equals(session.getAttribute("fileCode"))) { zwrot "sukcesu"; } else { return "fail"; } } } W czwartym kroku akcja zaczyna przeskakiwać do Md5_dao z wartościami pakiet com.crypt.dao; import com.crypt.md5.Md5Crypt_1; import com.crypt.md5.Md5Crypt_2; Public Class Md5_dao { public static String getFileCode(String fileName) rzuca wyjątek { System.out.println(fileName); String hashCode = Md5Crypt_1.getHash(fileName, "MD5"); System.out.println(hashCode); return hashCode; } } Piątym krokiem jest stworzenie API w systemie do obliczania wartości MD5 pliku, czyli wywołania go bezpośrednio w DAO, a teraz jest on bezpośrednio przetwarzany metodą Md5Crypt_1 pakiet com.crypt.md5; import java.io.*; import java.security.*; Public Class Md5Crypt_1 { publiczny statyczny char[] hexChar = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; public static void main(String[] args) rzuca Exception { String fileName = "e:/111.txt"; Typ skrótu ciągu = "MD5"; System.out.println(hashType + " == " + getHash(fileName, hashType)); } public static String getHash(Nazwa pliku ciągu, Typ skrótu ciągu) rzuca Wyjątek { InputStream fis; fis = nowy FileInputStream(fileName); bajt[] bufor = nowy bajt[1024]; MessageDigest md5 = MessageDigest.getInstance(hashType); int numRead = 0; while ((numRead = fis.read(buffer)) > 0) { md5.update(buffer, 0, numRead); } fis.close(); return to HexString(md5.digest()); } public static String toHexString(byte[] b) { StringBuilder sb = nowy StringBuilder(b.length * 2); //Skonstruuj generator ciągów i zainicjalizuj go do określonych treści ciągu dla (int i = 0; I < B.Length; i++) { sb.append(hexChar[(b& 0xf0) >>> 4]); dołączMetody zawsze dodają te znaki na końcu generatora sb.append(hexChar[b& 0x0f]); } return sb.toString(); } } Krok 6: Po pomyślnym obliczeniu wartości MD5 pliku, pierwszy MD5 jest przechowywany w sesji w akcji, a poprzez konfigurację pliku konfiguracyjnego struts2 przeskakuje do seccess.jsp, wyświetla wartość MD5 obliczoną po raz pierwszy i wywołuje wezwanie do rozpoczęcia drugiego obliczenia: Kod źródłowy w Success.jsp: <body> Za pierwszym razem to obliczonoMD5Wartość to: <s:wartość iteratora="Md5FilesEntity" id="Md5FilesEntity" status="L"> <s:property value="#Md5FilesEntity.fileAfterHashCode1" /> </s:iterator> <center> <form action="fileCrypt2" method="get"> <table> <tr> <td>Nazwa pliku</td>: <td><typ wejścia="nazwa pliku="Md5FilesEntity.filename" /> </td> <td><typ wejścia=wartość "wyślij" = "start" /> </td> </tr> </table> </form> <form> <textarea style="text-align: left; " rzędy="10" przełęcze="41" readonly="readonly"> <s:wartość iteratora="Md5FilesEntity" id="Md5FilesEntity" status="L"> <s:property value="#Md5FilesEntity.Md5FileCode" /> </s:iterator> </textarea> </form> </center> </body> Krok 7: Rozpocznij drugie zgłoszenie i oblicz goMD5Wartość jest obliczana po raz drugi po ponownym obliczeniu zgodnie z powyższym procesemMD5Wartość ta jest porównywana z wartością pierwszego razu, jeśli jest to dwa razyMD5 jeśli jest to to samo, oznacza to, że nie ma żadnej manipulacji; Jeśli dwa razyMD5Jeśli wartość jest inna, dokument został zmanipulowany. W ten sposób cały system zostaje kompletny. Testowanie systemów odpornych na manipulacje dokumentami Połóż system na regałuTomact 6.0wejdź i zorientuj sięWebUciekaj. Poniżej znajduje się diagram testowy układu: Krok 1: Dodaj pliki, które trzeba obliczyć. I zaostrzyć represje"start" do rozpoczęcia obliczeń.
Drugi krok jest obliczanyMD5, wsuccess.jsppokazuje pierwszy obliczonyMD5wartość i ekspozycję. Wykonywane jest także drugie obliczenie, aby sprawdzić, czy nie został on zmanipulowany.
Trzecim krokiem jest wykonanie drugiego obliczenia bez manipulacji dokumentemMD5wartości. Jeśli nie ma manipulacji, strona bez skoku zostanie przeskoczona bezpośrednio i wyświetli się komunikat "plik nie został zmieniony". Jeśli dokument został zmanipulowany, będzie to widoczne, że dokument został zmanipulowany.
Krok 4: Wprowadź zmiany w pliku i powtórz powyższy test Pierwsze obliczenie:
Po pomyślnym obliczeniu:
Piątym krokiem jest celowe manipulowanie dokumentem i jego obliczenie. Zasadniczo dokument jest manipulowany i obliczany dwukrotnieMD5Nie, podczas porównywania powinieneś być poinformowany, że plik został zmodyfikowany.
W tym momencie testy całego systemu zostają zakończone.
|