Srodne teme
Kliknite za generisanje liste srodnih tema...
Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

MD5CryptoServiceProvider

[es] :: .NET :: MD5CryptoServiceProvider

[ Pregleda: 2470 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

havramm
Miroslav Havram
Software Developer / Engineer
Beograd

Član broj: 4603
Poruke: 255
*.proxy.cg.yu



Profil

icon MD5CryptoServiceProvider01.02.2004. u 01:12 - pre 246 meseci
Da li se neko od vas igrao sa Cryptography namespace-om? Interesuje me konkretno klasa MD5CryptoServiceProvider i njena funkcija ComputeHash(). Naime deluje mi kao da ne racuna hash vrednost bas kako treba. Doduse postoji i druga mogucnost, a to je da ja ne znam kako da dobro inicijalizujem vrednosti ulaznog niza bajtova.

Probao sam nesto ovako:
Code:

using System;
using System.Text;
using System.Security.Cryptography;

public class App
{
    public static void Main()
    {
        UnicodeEncoding encoding = new UnicodeEncoding();
        byte[] dataToHash = encoding.GetBytes("havramm");
        MD5CryptoServiceProvider md5Csp = new MD5CryptoServiceProvider();
        byte[] hash = md5Csp.ComputeHash(dataToHash);

        Console.WriteLine(BitConverter.ToString(hash));
    }
}


Sto da sledeci rezultat:
Code:

E5-72-98-B7-F1-CD-36-46-B3-A0-99-3A-ED-06-5B-04


Ovo sam probao prema primeru iz SDK-a Hash Sample.

E sada kada pokrenem implementaciju MD5 algoritma skinutu sa sajta RSA Data Security, Inc. (davno sam to skinuo, ne znam adresu...) i pokrenem (sa ulaznim stringom "havramm"), dobijem sledeci rezultat:
Code:

d8d48d5b8d4a391d88498bbf59a2acfe


Takodje mi i implementacija MD5 algoritma u JavaScript-u sa sajta Yahoo-a da hash vrednost kao u drugom slucaju...

Moze li mi neko pomoci i ukazati pravi put?

Hvala!

[Ovu poruku je menjao havramm dana 02.02.2004. u 14:36 GMT]
If it's a girl then they're gonna call it Sigourney, after an actress. If it's a boy, then they're gonna call it Rodney, after Dave!
 
Odgovor na temu

-zombie-
Tomica Jovanovic
freelance programmer
ni.ac.yu

Član broj: 4128
Poruke: 3448
*.vdial.verat.net

Sajt: localhost


+5 Profil

icon Re: MD5CryptoServiceProvider01.02.2004. u 02:55 - pre 246 meseci
garantovano ti je problem sa enkodingom.. C# sve stringove drži u UTF-16 enkodingu, a ova druga dva rešenja što si probao koriste običan ASCII.

znači da bi bio siguran da nije do funkcije, napravi niz bajtova ove sadržine (ascii kodovi stringa "havramm"):

104 97 118 114 97 109 109

i provuči ga kroz funkciju. trebalo bi da dobiješ isti rezultat kao sa tim drugim algoritmima.


ako dobiješ isto (a dobićeš), znači da funkcija radi, a problem je u enkodingu.

evo našao sam klasu System.Text.UTF8Encoding koju treba da zameniš umesto UnicodeEncoding da bi dobio isti rezultat. (zato što su engleska slova prestavljena istim brojevima u ASCII i UTF-8 enkodinzima)

e sad, nisam siguran ali pretpostavljam da ti se može desiti da utf8 encoding vrati i tzv BOM karakter na početku texta (da označi u kom je enkodingu), pa da ti opet dobiješ pogrešan rezultat.

ako se to desi (pogledaj dužinu dobijenog niza, trebala bi da je ista kao i broj karaktera originalnog texta, ako si koristio samo engleska slova), onda možeš malo "seljački" samo da izbaciš prva tri bajta iz niza, i da tek onda propustiš kroz md5 hash. to bi moralo da radi..

(kažem seljački, jel nije baš elegantno. verovatno postiji i elegantije rešenje, ali ja inače ne poznajem .net, tako da ti ne mogu više pomoći..)
 
Odgovor na temu

havramm
Miroslav Havram
Software Developer / Engineer
Beograd

Član broj: 4603
Poruke: 255
212.62.55.*



Profil

icon Re: MD5CryptoServiceProvider02.02.2004. u 12:39 - pre 246 meseci
Definitivno je problem u enkodiranju. Sada nemam vremena, ali cu poslepodne postaviti ono sto sam utvrdio, zajedno sa nekim primercicem i diskusijom.

Pozdrav
If it's a girl then they're gonna call it Sigourney, after an actress. If it's a boy, then they're gonna call it Rodney, after Dave!
 
Odgovor na temu

havramm
Miroslav Havram
Software Developer / Engineer
Beograd

Član broj: 4603
Poruke: 255
*.proxy.cg.yu



Profil

icon Re: MD5CryptoServiceProvider02.02.2004. u 20:06 - pre 246 meseci
Kao sto sam sto je zombie rekao, a i ja sam otkrio, ceo problem je u enkodovanju stringa.
Naime, default implementacija MD5 algoritma podrazumeva da jedan karakter ima 1 bajt. I to je sve radilo super dok se nije pojavio Unicode. E sad on za kodovanje jednog karaktera ne koristi 1 nego 2 bajta iliti 16 bita. "Tamo" negde, nezavisno od svega ovoga, Intel je skontao da mu ne odgovara da reci (16 nekada, sada 32, sutra 64 bitne) ne predstavlja onako kako smo ucili u skolama (bajt najvece tezine ide prvi pa tako dalje sve do bajta najmanje tezine), vec uvodi novu konvenciju koju naziva "Little-Endian" i koja propisuje da bajt najmanje tezine ide prvi pa tako dalje sve do bajta najvise tezine. Ove konvencije se takodje pridrzava i default implementacija MD5 algoritma R. Rivest-a. Samo da napomenem da u okviru bajta i dalje ostaje da se bit najvece tezine nalazi prvi itd. do bita najmanje tezine.

Primer:
Code:

4275878552:

Little-Endian: 98 BA DC FE
Po "skolama" : FE DC BA 98

Sta je to sve prouzrokovalo? Dobili smo dva nacina Unicode kodovanja karaktera. Prvi, vec navedeni, "Little-Endian" (inace default unicode encoding u .NET Framework-u) i onaj drugi, "po skolama", nazvan "Big-Endian", tj. bajt najvece tezine prvi itd. do bajta najmanje tezine. Samim tim, jedan karakter se moze kodirati na tri nacina: ANSI, i dve vrste Unicode-a.

Primer:
Code:

karakter 'h':
ANSI:            0x68
Unicode, Little-Endian:    0x6800
Unicode, Big-Endian:    0x0068


E bas na to ja nisam obratio paznju kada sam poceo da se igram sa MD5CryptoServiceProvider-om. Klasa radi OK i za ono sto joj uneses daje OK rezultat, ali ja nisam obracao paznju na to sta sam unosio, vec sam lupio ono na sta sam naisao u prvom primeru, aha, rekoh, daj da to uporedim i sa nekim drugim implementacijama, kad tamo... Alarm! No, nakon malo proucavanja i razmatranja, video sam da je jako bitno da znas sta dajes da se hash-uje i da ce samo tako rezultati da se "potrefe". I tako, evo ispod jednog primercica koji demonstrira sve gore navedeno i otklanja sve nedoumice.

Code:

using System;
using System.Text;
using System.Security.Cryptography;

namespace MD5Test
{
    class TestApp
    {
        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                ShowHashes("havramm");
            }
            else
            {
                ShowHashes(args[0]);
            }
        }

        private static void ShowHashes(string stringToHash)
        {
            MD5CryptoServiceProvider md5Csp = new MD5CryptoServiceProvider();

            byte[] dataToHash = Encoding.Default.GetBytes(stringToHash);
            byte[] hash = md5Csp.ComputeHash(dataToHash);

            // ANSI Encoding
            Console.WriteLine(Encoding.Default.EncodingName + ":");
            ShowData(dataToHash);
            ShowHash(hash);
            Console.WriteLine();

            // Unicode encoding, Little-Endian
            UnicodeEncoding ue = new UnicodeEncoding();

            dataToHash = ue.GetBytes(stringToHash);
            hash = md5Csp.ComputeHash(dataToHash);

            Console.WriteLine(ue.EncodingName + ":");
            ShowData(dataToHash);
            ShowHash(hash);
            Console.WriteLine();

            // Unicode encoding, Big-Endian
            ue = new UnicodeEncoding(true, true);

            dataToHash = ue.GetBytes(stringToHash);
            hash = md5Csp.ComputeHash(dataToHash);

            Console.WriteLine(ue.EncodingName + ":");
            ShowData(dataToHash);
            ShowHash(hash);
        }

        private static void ShowData(byte[] data)
        {
            Console.Write("\tData To Hash:\t");

            foreach (byte b in data)
            {
                Console.Write("{0:x2} ", b);
            }

            Console.WriteLine();
        }

        private static void ShowHash(byte[] hash)
        {
            Console.Write("\tHash:\t\t");

            foreach (byte b in hash)
            {
                Console.Write("{0:x2}", b);
            }

            Console.WriteLine();
        }
    }
}


Rezultat primera:
Code:

Western European (Windows):
        Data To Hash:   68 61 76 72 61 6d 6d
        Hash:           d8d48d5b8d4a391d88498bbf59a2acfe

Unicode:
        Data To Hash:   68 00 61 00 76 00 72 00 61 00 6d 00 6d 00
        Hash:           e57298b7f1cd3646b3a0993aed065b04

Unicode (Big-Endian):
        Data To Hash:   00 68 00 61 00 76 00 72 00 61 00 6d 00 6d
        Hash:           fc597671180dd7f9cd98a6052bd64026


I tako, stvarno ogroman post, nadam se da ce nekom koristiti, u svakom slucaju, ne skodi, a sto ne skodi, znaci... :)
If it's a girl then they're gonna call it Sigourney, after an actress. If it's a boy, then they're gonna call it Rodney, after Dave!
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.racasse.se

Sajt: dejan.lekic.org


+2 Profil

icon Re: MD5CryptoServiceProvider03.02.2004. u 08:00 - pre 246 meseci
U principu to sto pricas je bitno samo kada je rec o nekoj
distribuiranoj aplikaciji, generalno nekoj mreznoj aplikaciji -
klijentu/serveru.
Na lokalnoj masini ako covek napravi MD5 od bilo kakvog stream-a, to je
okej. Najportabilnije je da se svaki "sumnjivi" stream "enkoduje" u
bytestream a onda na nekoj ciljnoj masini samo taj bytestream ispravno
treba dekodovati. Naravno, "tamo" ne treba prvo dekodovati stream, pa
racunati MD5, vec prvo racunati MD5 sa originalnim "enkoding"-om, pa
onda dekodovati na odgovarajuci nacin za lokal.
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

[es] :: .NET :: MD5CryptoServiceProvider

[ Pregleda: 2470 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Srodne teme
Kliknite za generisanje liste srodnih tema...
Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.