2010-08-10 18 views
17

Generalnie tworzę interfejs API w php, a jednym z parametrów, które zaakceptuje, będzie zaszyfrowana wartość md5. Nie mam dużej wiedzy na temat różnych języków programowania, a także na temat MD5. Moje podstawowe pytanie brzmi: jeśli akceptuję zaszyfrowane wartości md5, wartość pozostanie taka sama, wygenerowana z dowolnego języka programowania, takiego jak .NET, Java, Perl, Ruby ... itd.Czy wynik funkcji kryptograficznej MD5 będzie taki sam we wszystkich językach programowania?

Albo będzie jakieś ograniczenie lub zatwierdzenia dla niego.

+8

Powinieneś używać SHA512. – SLaks

+5

używasz hasha md5 nie zaszyfrowanej wartości. Szyfrowanie i mieszanie to nie to samo. – Chris

+1

@Chris, podczas gdy zalety metody są dyskusyjne, możesz użyć algorytmu mieszającego do szyfrowania jednokierunkowego. – corsiKa

Odpowiedz

25

Tak, prawidłowa implementacja md5 da taki sam wynik, w przeciwnym razie md5 nie byłby użyteczny jako suma kontrolna. Różnica może pochodzić z kodowania i byte order. Musisz mieć pewność, że tekst jest kodowany do tej samej sekwencji bajtów.

+7

Należy wspomnieć, że uzyskanie rzeczy, które mają * dokładnie * te same bajty, jest nieistotnym problemem.Kodowanie tekstu, kolejność bajtów, lista jest kontynuowana. –

+3

Również zakończenia linii - Miałem naprawdę denerwujący błąd, gdy tylko md5sums nie pasowały do ​​wielu systemów, i okazało się, że niektóre systemy usuwały końcowy znak nowej linii z tekstu wejściowego, a inne nie. – Ether

+1

Twoja odpowiedź oznacza wózek przed koniem. MD5 ma dać ci sposób na zagwarantowanie, że masz dokładnie te same bajty. Travis ma rację, to nie jest banalny problem. Dlatego te sumy kontrolne istnieją, aby upewnić się, że otrzymujesz dokładnie te same bajty. – corsiKa

5

Tak. MD5 nie jest funkcją szyfrowania, jest to hash function, który używa określonego algorytmu.

3

Tak, skróty md5 będą zawsze takie same niezależnie od ich pochodzenia - o ile algorytm bazowy jest poprawnie zaimplementowany.

3

Ważnym punktem bezpiecznych funkcji skrótu, takich jak MD5, jest to, że zawsze wytwarzają tę samą wartość dla tego samego wejścia.

Jednak wymaga to zakodowania danych wejściowych do sekwencji bajtów (lub bitów) w ten sam sposób. W przypadku instancji istnieje wiele sposobów kodowania ciągu znaków.

14

Będzie, ale jest , ale.

Spowoduje to, że jest w stanie rzetelnie wytworzyć ten sam wynik, biorąc pod uwagę powtarzającą się serię bajtów - chodzi o to, że możemy następnie porównać te wyniki, aby sprawdzić, czy bajty się nie zmieniły, lub może tylko cyfrowo podpisać MD5 wynik, a nie podpisanie całego źródła.

The ale jest to, że wspólnym źródłem błędów jest założenie o tym, jak łańcuchy są kodowane. MD5 działa na bajtach, a nie na znakach, więc jeśli mieszamy łańcuch znaków, to naprawdę zaszyfrujemy określone kodowanie tego łańcucha. Niektóre języki (a nawet niektóre środowiska wykonawcze) faworyzują określone kodowania, a niektórzy programiści są przyzwyczajeni do przyjmowania założeń dotyczących tego kodowania. Co gorsza, niektóre specyfikacje mogą przyjmować założenia dotyczące kodowania. Może to być przyczyną błędów, w których dwie różne implementacje będą generować różne skróty MD5 dla tego samego ciągu znaków. Dzieje się tak zwłaszcza w przypadkach, gdy znaki są spoza zakresu od U + 0020 do U + 007F (a ponieważ U + 007F jest formantem, to ma swoje własne problemy).

Wszystko to dotyczy innych skrótów kryptograficznych, takich jak rodzina skrótów SHA.

+0

Dzięki za wyjaśnienie, a jak rozumiem z twojego punktu jest tak daleko, jak kodowanie ciągów są takie same, będzie produkować ten sam skrót md5 niezależnie od języka programowania. Dzięki – jtanmay

+0

Tak, a znak nowej linii musi być taki sam. MD5 gwarantuje poprawny wynik z takim samym zbiorem bajtów, to nie jest podawanie odpowiednich bajtów, które powodują błędy. –

+0

Aby było zabawniej, niektóre języki programowania mogą dodawać znaczniki kolejności bajtów, gdy tekst jest kodowany przy użyciu jednego ze schematów kodowania Unicode. Widziałem nawet BOM UTF-8 używane w środowisku naturalnym. Oczywiście spowoduje to różne skróty MD5. Ponadto niektóre implementacje wyprowadzają * zakodowaną wersję * skrótu, np. PHP będzie z powodzeniem produkować 32-cyfrowy łańcuch szesnastkowy zamiast 16 bajtów domyślnie. –

Powiązane problemy