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."; }
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.
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.
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.
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.