Avatar billede Droa Seniormester
02. juni 2016 - 11:14 Der er 2 kommentarer og
1 løsning

Hjælp til og forstå RFC dokumentation

Hej Eksperter.

Jeg er igang med og implementere en gammel beskrivelse i mit program.
RFC2831 er beskrevet som usikker og ikke burde bruges, men da jeg ikke er min egen chef er der intet og gøre ved det...

Jeg har lidt svært ved og forstå deres beskrivelse, og ville høre om nogen kunne hjælpe?

https://tools.ietf.org/html/rfc2831#section-1.1


"Let HEX(n) be the representation of the 16 octet MD5 hash n as a
  string of 32 hex digits (with alphabetic characters always in lower
  case, since MD5 is case sensitive)."


betyder dette at HEX() bare er en validering at n er en MD5, og den funktion kun burde være og lave til lowercase samt give fejl, hvis n ikke er MD5?
Avatar billede arne_v Ekspert
02. juni 2016 - 15:27 #1
Det laeses som:

n = 16 bytes med MD5 hash
HEX(n) = 32 characters med hver byte konverterer til 2 characters med hex vaerdi af byte

byte med 0 bliver til "00"
byte med 9 bliver til "09"
byte med 10 bliver til "0A"
byte med 15 bliver til "0F"
byte med 16 bliver til "10"
etc.
Avatar billede arne_v Ekspert
02. juni 2016 - 15:28 #2
Og ja MD5 er haabloest foraeldet.

:-)
Avatar billede Droa Seniormester
02. juni 2016 - 15:35 #3
Tog mig lige lidt længere tid end jeg tør indrømme,  men det var os det jeg kom frem til. dette blev den kode jeg endte op med. :)


        public string GenerateResponse(string user, string realm, string password, string nonce, string cnonce, string authzid, string digesturi, string qop, string nc)
        {
            byte[] A2 = (qop.Equals("auth") ? Encoder.GetBytes($"AUTHENTICATE:{digesturi}"): Encoder.GetBytes($"AUTHENTICATE:{digesturi}:00000000000000000000000000000000"));

            byte[] h1 = H(Encoder.GetBytes($"{user}:{realm}:{password}"));
            byte[] h2 = Encoder.GetBytes($":{nonce}:{cnonce}");

            byte[] A1 = Merge(h1,h2);
            byte[] response_value = HEX(KD(HEX(H(A1)),
                Merge(Encoder.GetBytes($"{nonce}:{nc}:{cnonce}:{qop}:"), HEX(H(A2)))
                ));

            byte[] h3 = Merge(h1, h2);
            return Encoder.GetString(response_value);
        }

        public string GenerateHash(string user, string realm, string password, string nonce, string cnonce, string authzid, string digesturi, string qop, string nc)
        {
            byte[] A2 = (qop.Equals("auth") ? Encoder.GetBytes($":{digesturi}") : Encoder.GetBytes($":{digesturi}:00000000000000000000000000000000"));

            byte[] h1 = H(Encoder.GetBytes($"{user}:{realm}:{password}"));
            byte[] h2 = Encoder.GetBytes($":{nonce}:{cnonce}");

            byte[] A1 = Merge(h1, h2);
            byte[] response_value = HEX(KD(HEX(H(A1)),
                Merge(Encoder.GetBytes($"{nonce}:{nc}:{cnonce}:{qop}:"), HEX(H(A2)))
                ));

            byte[] h3 = Merge(h1, h2);
            return Encoder.GetString(response_value);
        }

        /// <summary>
        /// Let H(s) be the 16 octet MD5 hash [RFC 1321] of the octet string s.
        /// </summary>
        /// <param name="s">Byte Array Af streng for at sikre encodning</param>
        /// <returns>s -> Base16(s) = s16 -> MD5Hash(s16)</returns>
        public byte[] H(byte[] s)
        {
            MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
            return md5.ComputeHash(s);
        }
        /// <summary>
        /// Let KD(k, s) be H({k, ":", s}), i.e., the 16 octet hash of the string k, a colon and the string s.
        /// </summary>
        /// <param name="k">Byte Array Af streng for at sikre encodning</param>
        /// <param name="s">Byte Array Af streng for at sikre encodning</param>
        /// <returns>k + ":" + s = ks -> H(ks)</returns>
        public byte[] KD(byte[] k, byte[] s)
        {
            byte[] colon = Encoder.GetBytes(":");
            byte[] ks = Merge(k, colon, s);
            return H(ks);
        }
        /// <summary>
        /// Let HEX(n) be the representation of the 16 octet MD5 hash n as a string of 32 hex digits(with alphabetic characters always in lower case, since MD5 is case sensitive).
        /// </summary>
        /// <param name="n">Byte Array Af streng for at sikre encodning</param>
        /// <returns>lowercase of n</returns>
        public byte[] HEX(byte[] n)
        {
            byte[] b = Encoder.GetBytes(toBase16(n).ToLower());
            return b;
        }
        /// <summary>
        /// Merge byte arrays, Hurtig Merge af de mange byte arrays denne classe arbejder med
        /// </summary>
        /// <param name="ns">Array med Arrays af byte samlinger der kan oversættes med en Encoder til tekst</param>
        /// <returns></returns>
        public byte[] Merge(params byte[][] ns)
        {
            int index = 0;
            int length = 0;
            byte[] merged_n;
            foreach(byte[] n in ns)
            {
                length += n.Length;
            }
            merged_n = new byte[length];
            for(int arri = 0; arri < ns.Length; arri++)
            {
                Array.Copy(ns[arri], 0, merged_n, index, ns[arri].Length);
                index += ns[arri].Length;
            }
            return merged_n;
        }
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester