Avatar billede casper_skovgaard Nybegynder
05. januar 2006 - 09:45 Der er 26 kommentarer og
1 løsning

Digest authentication og MD5 passwords

Jeg har implementeret Peter Brombergs "Digest authentication with database" (http://www.eggheadcafe.com/articles/20030701.asp) i min website.
Det virker fint, der vises en loginboks og det indtastede brugernavn og kodeord valideres mod en sql database.
Mit problem er at denne implementering forventer at kodeord gemmes i klar tekst, dette vil jeg gerne ændre så de gemmes MD5 krypteret.

Mine spørgsmål er så:
Er dette overhovedet muligt?
Kan Brombergs kode ændres så den supportere MD5 kodeord?
Er der alternativer? Kan det gøres anderledes i ASP.NET 2.0?
Avatar billede dr_chaos Nybegynder
05. januar 2006 - 09:52 #1
Det burde kunne lade sig gøre ved at databasen indeholder et md5 hash af passwordet og det kodeord brugeren skriver laves om til et md5 hash inden det tjekkes mod hashet i databasen.
Det ar alt som skal ændres.
Avatar billede casper_skovgaard Nybegynder
05. januar 2006 - 10:01 #2
Jeg tror ikke jeg har adgang til det indtastede kodeord. Ved digest authentication sendes kodeordet (så vidt jeg ved) ikke til serveren.

Men har du evt. et forslag til hvor i koden dette skal gøres?
Avatar billede dr_chaos Nybegynder
05. januar 2006 - 10:31 #3
efter at have kigget lidt på koden kan jeg godt se hvad du mener.
Jeg vil tror at der er en måde at finde passwordet i denne del af koden:

  if (!GetPasswordAndRoles(httpApplication, str5, out str6, out strs3))
          {
            DenyAccess(httpApplication);
          }
          else
          {
            string authStr2;

            string str7 = ConfigurationSettings.AppSettings["System.Web.Security.DigestAuthenticationModule_Realm"];
            string str8 = String.Format("{0}:{1}:{2}", (String)listDictionary["username"], str7, str6);
            string str9 = GetMD5HashBinHex(str8);
            string authStr0 = String.Format("{0}:{1}", httpApplication.Request.HttpMethod, (String)listDictionary["uri"]);
            string authStr1 = GetMD5HashBinHex(authStr0);
            if (listDictionary["qop"] != null)
            {
              authStr2 = String.Format("{0}:{1}:{2}:{3}:{4}:{5}", new object[]{str9, (String)listDictionary["nonce"], (String)listDictionary["nc"], (String)listDictionary["cnonce"], (String)listDictionary["qop"], authStr1});
            }
            else
            {
              authStr2 = String.Format("{0}:{1}:{2}", str9, (String)listDictionary["nonce"], authStr1);
            }
            string authStr3 = GetMD5HashBinHex(authStr2);
            bool flag2 = IsValidNonce((String)listDictionary["nonce"]) == false;
            httpApplication.Context.Items["staleNonce"] = flag2;
            if ((String)listDictionary["response"] == authStr3 && !flag2)
            {
              httpApplication.Context.User = new GenericPrincipal(new GenericIdentity(str5, "Rassoc.Samples.Digest"), strs3);
            }
            else
            {
              DenyAccess(httpApplication);
            }
          }
Avatar billede casper_skovgaard Nybegynder
05. januar 2006 - 16:20 #4
Jeg kan ikke på noget tidspunkt se kodeordet i klar tekst, derfor kan ikke rigtig gøre noget ved det...

Måske man skal ændre noget i det første svar serveren sender til klienten...

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Digest realm="RassocDigestSample", nonce="Ny8yLzIwMDIgMzoyNjoyNCBQTQ", opaque="0000000000000000", stale=false, algorithm=MD5, qop="auth"

Nogle forslag?
Avatar billede dr_chaos Nybegynder
05. januar 2006 - 16:26 #5
umiddelbart kunne det godt se udsom om at selv om password i db ikke er krypteret så sammenligner den 2 md5 hash mod hinanden.
Jeg kan ikke se hvordan de skulle kunne lade sig gøre at ændre på den eksisterende kode.
Jeg ser lige hvad muligheder der er i asp.net 2.0
Avatar billede dr_chaos Nybegynder
05. januar 2006 - 16:32 #6
Kan ikke umiddelbart finde noget.
Kan du ikke nøjes med forms authentication i asp.net 2.0 ?
Avatar billede casper_skovgaard Nybegynder
05. januar 2006 - 16:36 #7
Jeg tror ikke jeg kan bruge form based authentication, da det er et andet program der skal kunne logge ind. Er det ikke korrekt?

Ved du om man kan lave en SQLMembershipProvider og bruge den samme med Digest authentication?
Avatar billede dr_chaos Nybegynder
05. januar 2006 - 16:41 #8
i princippet kan man godt.
Med webrequest kan du åbne en side og indtaste brugernavn og password.
Men jeg har ikke den store erfaring med det.

umiddelbart kunne man nok godt lave det sammen med SQLMembershipProvider men det ville være noget være rod.
bla. fordi SQLMembershipProvider selv sørger for at oprette authentication ticket osv.
Avatar billede casper_skovgaard Nybegynder
05. januar 2006 - 17:38 #9
ja der er jo ikke lige frem en optimal løsning.. Jeg lader spørgsmålet stå åbent lidt endnu så andre kan komme med deres guldkorn. Tak for hjælpen indtil videre chaos.
Avatar billede dr_chaos Nybegynder
05. januar 2006 - 17:42 #10
np :)
Avatar billede casper_skovgaard Nybegynder
09. januar 2006 - 13:18 #11
Jeg har desværre ikke fundet en løsning endnu. Men meget tyder på at jeg ikke kan bruge digest auth.

chaos ved du om det er muligt at bruge basic authentication istedet. Kender du nogle eksempler på dette?
Avatar billede dr_chaos Nybegynder
09. januar 2006 - 13:38 #12
hvad præcist er formålet med siden ?
Avatar billede casper_skovgaard Nybegynder
09. januar 2006 - 13:46 #13
:)

et install script på en linux server skal have adgang til at downloade filer på webserveren. Når scriptet køres skal der indtastes brugernavn og password som sendes med det request der laves til webserveren. Brugernavn og passwords skal valideres mod en sql database.
Avatar billede dr_chaos Nybegynder
09. januar 2006 - 13:53 #14
Kunne det betale sig at lave det som en webservice ?
Der kan man lave authentication rimligt simpel.
Hvordan skal filerne downloades ?
Avatar billede casper_skovgaard Nybegynder
09. januar 2006 - 14:07 #15
Som det er nu angiver man bare det direkte link til filen, som så downloades som enhver anden fil, der kan downloads fra en webserver.

Jeg har desværre ingen erfaring med at bruge webservices, men det kan jeg jo få :)
Avatar billede dr_chaos Nybegynder
09. januar 2006 - 14:12 #16
det er meget simpelt at bruge webservices og det kan bruges i stortset alle programmerings sprog.
i de 2 kommende poster er der et meget simplet eksempel på en webservice der authenticater en bruger.
Avatar billede dr_chaos Nybegynder
09. januar 2006 - 14:13 #17
er selv igang med at lave en webservice og derfor har jeg det underlige navn:
webservice:

using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.IO;

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class KundeTilfredshedsWebservice : System.Web.Services.WebService
{
    public KundeTilfredshedsWebservice()
    {

        //Uncomment the following line if using designed components
        //InitializeComponent();
    }

    [WebMethod]
    public string HelloWorld() {
        return "Hello World";
    }

    public AuthHeader Authentication;

    [WebMethod]
    [SoapHeader("Authentication")]
    public string ValidUser()
    {
        if (Authentication.Username == "test" &&
                Authentication.Password == "test")
        return "authenticated";
        else
            return "not authenticated";
    }   
}
public class AuthHeader : SoapHeader
{
    public string Username;
    public string Password;
}
Avatar billede dr_chaos Nybegynder
09. januar 2006 - 14:15 #18
et button click event i en windows form som resulterer i at en streng vises i en label:

  private void button1_Click(object sender, EventArgs e)
        {
            KundeTilfredshedsWebservice.KundeTilfredshedsWebservice ktw = new KundeTilfredshedsWebservice.KundeTilfredshedsWebservice();
            KundeTilfredshedsWebservice.AuthHeader a = new TestKundeTilfredshed.KundeTilfredshedsWebservice.AuthHeader();
            a.Username ="test";
            a.Password = "test";
            ktw.AuthHeaderValue = a;
            label1.Text = ktw.ValidUser();
        }
Avatar billede dr_chaos Nybegynder
09. januar 2006 - 14:15 #19
I et windows programm tilføjer man bare en webreference til programmet.
Avatar billede dr_chaos Nybegynder
09. januar 2006 - 14:16 #20
undskyld til webservicen.

det er faktisk en test jeg selv har lavet idag :)
Avatar billede dr_chaos Nybegynder
09. januar 2006 - 14:16 #21
if (Authentication.Username == "test" &&
                Authentication.Password == "test")
i webservicen kan erstattes med et databasen kald f.eks.
Avatar billede casper_skovgaard Nybegynder
09. januar 2006 - 14:51 #22
som jeg har forstået det forgår al data trafik mellem webservicen og programmet vha. xml... Er det ikke et problem når filer skal downloades?
Avatar billede dr_chaos Nybegynder
09. januar 2006 - 15:01 #23
det er ikke noget problem.
Denne webmetode viser hvordan du kan sende en fil fra serveren til en client:

[WebMethod]
public byte[] GetUpdate()
{
FileInfo fi = new FileInfo("output.dll");
byte[] returnData = new byte[fi.Length];
FileStream fs = File.OpenRead("output.dll");
fs.Read(returnData,0,fi.Length);
fs.Close();
return returnData;

}
Avatar billede dr_chaos Nybegynder
09. januar 2006 - 15:02 #24
på din client skal du så bare have en funktion til at modtage data.
Avatar billede casper_skovgaard Nybegynder
09. januar 2006 - 15:11 #25
det skal ihvertfald prøves :)

smid lige et svar, det er på tide du for nogle point for din store hjælp.

jeg vender tilbage når jeg får det til at virke.

tak for hjælpen.
Avatar billede dr_chaos Nybegynder
09. januar 2006 - 15:13 #26
np :)
Avatar billede dr_chaos Nybegynder
09. januar 2006 - 15:15 #27
du kan opbygge det på en måde så du viser alle filerne på klienten og ved et tryk på en fil kalder du op til webservicen for at begynde at downloade filen.
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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