Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C#: ASP.NET ja SHA1

Danae [31.08.2008 18:04:18]

#

Koodailen asp.netillä pienimuotoista projektinhallintasovellusta, josta suurinosa alkaa olla valmiina, mutta yksi tärkeä asia ei toimi: salasanan kryptaus tietokantaan. Käytän sha1:ta, ja jostain syystä se kryptaa kaikki salasanat aivan samalla tavalla. Eli millä tahansa salasanalla ei pääse sisään, mutta kaikilla, jotka on tallennettu tietokantaan, riippumatta siitä onko salasana oma vai jonkun muun.

Alla pätkä koodista, toivottavasti joku osaa auttaa.

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.Odbc;
using System.Security.Cryptography;

public partial class _Default : System.Web.UI.Page
{
    OdbcConnection yhteys = null;
    OdbcCommand komento = null;
    OdbcDataReader vastaus = null;
    string lause = "";
    SHA1 sha;

// tietokantayhteyden avaaminen ...

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
    {
        try
        {
            sha = new SHA1CryptoServiceProvider();
            byte[] pw = new byte[Login1.Password.Length];
            byte[] salasana = sha.ComputeHash(pw);

            string salasanacrypt = "";
            foreach (char merkki in salasana) {
                salasanacrypt = salasanacrypt + merkki;
            }

            lause = "SELECT salasana FROM dotnetkayttajat WHERE tunnus = '" + Login1.UserName + "'";
            komento = new OdbcCommand(lause, yhteys);
            vastaus = komento.ExecuteReader();

            Boolean ktok = false;

            while (vastaus.Read())
            {
                if (vastaus.GetString(0) == salasanacrypt)
                {
                    //Tallennetaan käyttäjäntunnus sessio-muuttujaan
                    Session["kt"] = Login1.UserName.ToString();
                    //Ja ohjataan käyttäjä kalenterisivulle
                    Response.Redirect("kalenteri.aspx");
                    yhteys.Close();
                }
            }

            if (!ktok)
                e.Authenticated = false;

        }
        catch (Exception ex2)
        {
            Response.Write("Jokin meni sisäänkirjautumisessa pieleen!<br/>" + ex2 + "<br/>" + lause);
        }

    }

//Rekisteröidään käyttäjä
    protected void Button1_Click(object sender, EventArgs e)
    {
        string tunnus = TextBox1.Text;
        string salasana1 = TextBox2.Text;
        Boolean kentatok = true;
        Boolean salasanaok = true;
        Boolean tunnusok = true;

//tarkistelua ...

        if (tunnusok && salasanaok && kentatok)
            {
                //kryptataan salasana
                sha = new SHA1CryptoServiceProvider();
                byte[] pw = new byte[salasana1.Length];
                byte[] salasana = sha.ComputeHash(pw);

                string salasanacrypt = "";
                foreach (char merkki in salasana)
                {
                    salasanacrypt = salasanacrypt + merkki;
                }


                lause = "INSERT INTO dotnetkayttajat " +
                    " VALUES ('" + tunnus + "', '" + salasanacrypt + "', '" + etunimi + "', '" + sukunimi + "', '" + email + "', " + titteliint + ")";
                komento = new OdbcCommand(lause, yhteys);
                komento.ExecuteNonQuery();

                TextBox6.Text = "Sinut on rekisteröity! Voit nyt kirjautua sisään.";
            }

tsuriga [31.08.2008 18:17:17]

#

Nitpick: Sha1 on tiivistesumma-, ei kryptausalgoritmi. Ero on siinä, että tiivistesummasta ei voi saada suoraan selville alkuperäistä sisältöä, kun taas kryptattu teksti voidaan purkaa oikealla avaimella.

Danae [31.08.2008 18:27:13]

#

Voinen silti käyttää sha:ta tähän tarkoitukseen? Salasanaahan ei tuossa koodissa tarvitse purkaa, vaan annettu salasana muokataan sha:lla ja verrataan saatua summaa tietokannasta haettuun.

tsuriga [31.08.2008 18:37:56]

#

Jeps, näinhän se yleensä hoidetaan. Mutuna voisin arvioida, että sivustoista isoimmat sitten saattavat käyttää kryptausta ja yhdeksi argumentiksi esittäisin mahdollisten tiivistesummien kolliisioiden välttely, tiedä sitten. Mutta, kyllä voit asia klar ja pahoittelen keskustelun sivuraiteille johtamista.

Danae [31.08.2008 18:39:48]

#

Kiitos, pidetään tämä mielessä.

Tajusinkin tuossa koodia tavatessa, että eihän tuolle sha:lle missään vaiheessa kerrota summattavaa merkkijonoa. Apuja saa antaa, mutta nyt onkin helpompi etsiä itsekin vastauksia, kun tietää missä vika on.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta