Czy istnieje sposób na obliczenie skrótu MD5 pliku przed przesłaniem na serwer przy użyciu JavaScript?
javascript
md5
LuRsT
źródło
źródło
Odpowiedzi:
Chociaż istnieją implementacje JS algorytmu MD5, starsze przeglądarki zazwyczaj nie są w stanie odczytać plików z lokalnego systemu plików .
Napisałem to w 2009 roku. A co z nowymi przeglądarkami?
Dzięki przeglądarce obsługującej FileAPI * możesz * odczytać zawartość pliku - użytkownik musi go zaznaczyć za pomocą
<input>
elementu lub przeciągnij i upuść. Od stycznia 2013 r. Przedstawiamy zestawienie głównych przeglądarek:źródło
Stworzyłem bibliotekę, która implementuje przyrostowe md5 w celu wydajnego haszowania dużych plików. Zasadniczo czytasz plik w kawałkach (aby zachować mało pamięci) i haszujesz go przyrostowo. Masz podstawowe zastosowania i przykłady w pliku readme.
Pamiętaj, że potrzebujesz HTML5 FileAPI, więc koniecznie sprawdź to. Pełny przykład znajduje się w folderze testowym.
https://github.com/satazor/SparkMD5
źródło
.end()
metodą. Jeśli wywołasz tę metodę ponownie, następnym razem da ona zły wynik. Ponieważ.end()
dzwoni.reset()
wewnętrznie. To jest katastrofa kodowania i nie nadaje się do pisania w bibliotece.obliczenie skrótu MD5 przy użyciu funkcji MD5 w CryptoJS i HTML5 FileReader API jest całkiem łatwe . Poniższy fragment kodu pokazuje, w jaki sposób można odczytać dane binarne i obliczyć skrót MD5 z obrazu, który został przeciągnięty do przeglądarki:
Polecam dodać trochę CSS, aby zobaczyć obszar Drag & Drop:
Więcej na temat funkcji Drag & Drop można znaleźć tutaj: File API i FileReader
Próbkę przetestowałem w Google Chrome w wersji 32.
źródło
readAsBinaryString()
nie zostało to ustandaryzowane i nie jest obsługiwane przez Internet Explorer. Nie testowałem tego w Edge, ale nawet IE11 go nie obsługuje.readAsBinaryString()
: caniuse.com/#feat=filereader - obsługuje go Microsoft Edge.readAsBinaryString()
ponieważ nie jest obsługiwany przez starsze przeglądarki. Alternatywą, którą znalazłem, jest SparkMD5. Używa także API FileReader, ale metodareadAsArrayBuffer
obsługiwana przez IE. I może obsługiwać duże pliki, czytając je w kawałkach.CryptoJS.lib.WordArray.create(arrayBuffer);
HTML5 +
spark-md5
iQ
Zakładając, że korzystasz z nowoczesnej przeglądarki (obsługującej interfejs API plików HTML5), oto jak obliczyć skrót MD5 dużego pliku (obliczy hash na zmiennych fragmentach)
źródło
Musisz użyć FileAPI. Jest dostępny w najnowszych wersjach FF i Chrome, ale nie w IE9. Pobierz dowolną implementację md5 JS sugerowaną powyżej. Wypróbowałem to i porzuciłem, ponieważ JS był zbyt wolny (minuty w przypadku dużych plików graficznych). Może wrócę, jeśli ktoś przepisuje MD5 przy użyciu tablic typowanych.
Kod wyglądałby mniej więcej tak:
źródło
reader
zmienna będzie ostatnim plikiem do czasu uruchomienia funkcji onload.CryptoJS.lib.WordArray.create(arrayBuffer);
Co jest w większości przypadków bezużyteczne. Chcesz, aby MD5 był obliczany po stronie klienta, abyś mógł porównać go z kodem ponownie obliczonym po stronie serwera i stwierdzić, że przesyłanie poszło nie tak, jeśli się różnią. Musiałem to zrobić w aplikacjach pracujących z dużymi plikami danych naukowych, gdzie kluczem było otrzymywanie nieuszkodzonych plików. Moje przypadki były proste, ponieważ użytkownicy mieli już obliczoną MD5 na podstawie ich narzędzi do analizy danych, więc musiałem tylko poprosić ich o to za pomocą pola tekstowego.
źródło
Aby uzyskać hash plików, istnieje wiele opcji. Zwykle problem polega na tym, że bardzo wolno jest uzyskać skrót dużych plików.
Stworzyłem małą bibliotekę, która pobiera hash plików, z 64kb na początku pliku i 64kb na końcu.
Przykład na żywo: http://marcu87.github.com/hashme/ i biblioteka: https://github.com/marcu87/hashme
źródło
W Internecie jest kilka skryptów do tworzenia skrótu MD5.
Ten z webtoolkit jest dobry, http://www.webtoolkit.info/javascript-md5.html
Chociaż nie wierzę, że będzie miał dostęp do lokalnego systemu plików, ponieważ dostęp ten jest ograniczony.
źródło
mam nadzieję, że znalazłeś już dobre rozwiązanie. Jeśli nie, poniższe rozwiązanie jest obiecującą implementacją ES6 opartą na js-spark-md5
źródło
Poniższy fragment kodu przedstawia przykład, który może zarchiwizować przepustowość 400 MB / s podczas odczytu i haszowania pliku.
Korzysta z biblioteki o nazwie hash-wasm , która jest oparta na WebAssembly i oblicza skrót szybciej niż biblioteki obsługujące tylko js. Od 2020 roku wszystkie nowoczesne przeglądarki obsługują WebAssembly.
źródło
Przy obecnym HTML5 powinno być możliwe obliczenie skrótu md5 pliku binarnego, ale myślę, że krokiem poprzedzającym to byłoby przekonwertowanie danych banarnych BlobBuilder na ciąg znaków, próbuję wykonać ten krok: ale nie udało mi się.
Oto kod, który próbowałem: Konwertowanie BlobBuildera na ciąg znaków w JavaScript HTML5
źródło
Nie sądzę, aby w javascript był sposób na uzyskanie dostępu do zawartości przesłanego pliku. Dlatego nie możesz spojrzeć na zawartość pliku, aby wygenerować sumę MD5.
Możesz jednak wysłać plik na serwer, który następnie może odesłać sumę MD5 lub odesłać zawartość pliku ... ale to dużo pracy i prawdopodobnie nie opłaca się do twoich celów.
źródło