webForumDet fria alternativet

Säkerhet, Hash

.NETur .NET

11 svar · 909 visningar · startad av thevice

Medlem sedan dec. 2005198 inlägg
Frågan#1

Hejsan,

Har sökt både här och på google men jag hittar verkligen inget som ger klar text i hur jag ska göra.

Jag hr en databas nu med ca 500 användare. Lösenorden är inte hashade och det är väll nästan ett måste. Någon som sitter på en bra länk som beskrvier exakt hur jag hashar lösenord och sedan lägger in de i databasen?

Jag förstår inte nått utav det här. Ska jag kryptera ett lösenord när man registrerar sig och sen vad? Eller ska jag kryptera om lösenordet varje gång man loggar in eller hur ska jag göra?

Tacksam för svar.
/ Timmie

Medlem sedan aug. 2004903 inlägg
#2

Nu kan jag inte ASP.NET. Men principen borde vara den samma som för PHP. idag Måste du mer eller mindre hasha din lösenord och mer därtill. Hash+salt är någit du verkligen bör satsa på.

Man hashar lösenorden när dem läggs in i databasen. När en användare loggar in hashar du det lösenordsvärde du får via formuläret och jämför det mot databasen. Det är den enklaste versionen. FÅr någon tag på dessa lösenord i hash form så kommer det gå att kncäka många av dem genom att använda rainbowtables och bruteforce metoder. Du bör därför även satsa på salt.

Någon som kan ASP.NET kan förklara hur du ska göra i ASP.NET för att åstakomma det jag beskriver.

Medlem sedan jan. 20023 327 inlägg
Medlem sedan dec. 2005198 inlägg
#4

Tack så mycket för svaren.
Om jag kör med denna:
http://www.aspheute.com/english/20040105.asp

Vad ska då saltet vara för att det ska bli så bra som möjligt? Om jag kör ett random salt så går det väll inte att kontrollera om man har skrivit in rätt lösenord?

Så egentligen är det bara så här:
1. Ett lösenord skrivs in, som krypteras och lagras i databasen.
2. När man sedan ska logga in så krypterar man det lösenordet som man skrev in och kollar om det är samma som det i databasen?
3. Om man glömmer bort sitt lösenord så skapar man ett nytt för jag antar att det inte går att dekryptera?

Jag som har ca 500 lösenord att kryptera borde väll bara skapa en funktion som går igenom alla lösenord i databasen och krypterar de eller?

Medlem sedan jan. 20023 327 inlägg
#5

Skapa lösenord
1. Hasha och salta lösenordet
2. Spara lösenordet (hashat och saltat) samt saltet som användes för användaren i databasen.

Jämföra lösenord
1. Hämta saltet i databasen för den användare som försöker logga in.
2. Hasha och salta lösenordet med det salt du hämtat för användaren i databsen.
3. Jämför detta lösenord med det lösenordet som finns sparat för användaren i databasen.

Med andra ord. Om du inte har en aningen om saltet som användes just för detta lösenord så blir det jobbigt. ;)

thevice skrev:

Så egentligen är det bara så här:
1. Ett lösenord skrivs in, som krypteras och lagras i databasen.
2. När man sedan ska logga in så krypterar man det lösenordet som man skrev in och kollar om det är samma som det i databasen?
3. Om man glömmer bort sitt lösenord så skapar man ett nytt för jag antar att det inte går att dekryptera?

1. Japp, men glöm inte att även spara saltet.
2. Krypterar och saltar med det salt som användes för denna användares lösenord.
3. Helt korrekt!

thevice skrev:

Jag som har ca 500 lösenord att kryptera borde väll bara skapa en funktion som går igenom alla lösenord i databasen och krypterar de eller?

Japp så hade jag gjort. Ska du kryptera befintliga lösenord, eller generera nya?

Medlem sedan dec. 2005198 inlägg
#6

Tack så mycket, började kolla på det och testade lite snabbt:
Lösenordet:
M6cWPYyh
Krypterat:
???T????'?JQ?5?r?O?
Ska alla frågetecken vara där? I databasen blir det nämligen konstiga tecken och en massa frågetecken. Något jag borde oroa mig för eller är det lugnt? Är det något problem om man har åäö i lösenordet?

EDIT
Försökte logga in men det vill sig inte. Vad kan jag göra? Det är en massa frågetecken i databasen och en massa tecken som är okända för mig.

Medlem sedan jan. 20023 327 inlägg
#7

Det mest troliga är att du genererar ett lösenord i en annan teckenkodning än vad databasen klarar av. Hur ser lösenordet ut om du spottar ut det från programmet innan du sparar det i databasen?

Har du följande rad i koden du använder?

ASCIIEncoding encoder = new ASCIIEncoding();

Testa i så fall att ändra till:

UnicodeEncoding encoder = new UnicodeEncoding();
Medlem sedan dec. 2005198 inlägg
#8

Testade med UnicodeEncoding men då blir det bara frågetecken. Jag har tidigare haft problem med att inte åäö fungerar som det ska men det löste jag med:
public static string unicode_iso8859(string src)
{
Encoding iso = Encoding.GetEncoding("iso8859-1");
Encoding unicode = Encoding.UTF8;
byte[] isoBytes = iso.GetBytes(src);
return unicode.GetString(isoBytes);
}

Vet inte om det är till någon hjälp men men.
Sedan så testade jag att lägga in detta lösenord:
M6cWPYyh och fick ???T????'?JQ?5?r?O?

Vad är det för fel?

Medlem sedan jan. 20023 327 inlägg
#9

Jag skrev om denna metoden lite och det verkar fungera. Jag får i alla fall en vettig sträng tillbaka :)

public string ComputeSaltedHash()
{
           // Create Byte array of password string
            [B]Byte[] _secretBytes = Encoding.UTF8.GetBytes(_password);[/B]

            // Create a new salt
            Byte[] _saltBytes = new Byte[4];
            _saltBytes[0] = (byte)(_salt >> 24);
            _saltBytes[1] = (byte)(_salt >> 16);
            _saltBytes[2] = (byte)(_salt >> 8);
            _saltBytes[3] = (byte)(_salt);

            // append the two arrays
            Byte[] toHash = new Byte[_secretBytes.Length + _saltBytes.Length];
            Array.Copy(_secretBytes, 0, toHash, 0, _secretBytes.Length);
            Array.Copy(_saltBytes, 0, toHash, _secretBytes.Length, _saltBytes.Length);

            SHA1 sha1 = SHA1.Create();
            Byte[] computedHash = sha1.ComputeHash(toHash);
            [B]return Convert.ToBase64String(computedHash);[/B]
}
Medlem sedan dec. 2005198 inlägg
#10

Tack så mycket det vart bättre med den koden. :-)

Nu fungerar allt som det ska. :)

Medlem sedan jan. 20023 327 inlägg
#11

Gott att höra :)

Kanske lite sent, men jag tycker du ska kolla på denna en gång till när du är i farten: http://www.obviex.com/samples/hash.aspx#Output

Främsta fördelen med denna lösningen är att du inte behöver spara saltet i databasen. Vet du bara vilken hashnings-algorithm du använder, så är det enkelt att skilja hashet från saltet genom att kolla på bitarna/bytsen av det krypterade lösenordet.

Medlem sedan dec. 2005198 inlägg
#12

Saltet i sig gör ju vad jag har förstått bara att inte någon användare med samma lösenord som någon annan får samma hash värde eller hur?
Det gör också att om någon kommer och hälsar på i min databas inte får fram två lösenord som är lika dana lika lätt. Men den kan fortfarande få fram lösenorden.

Det som du länkade nu är det bättre i säkerhets synvinkel? Har precis gjort om hela databasen så om jag ska byta så ska jag nog göra det ganska snabbt innan det börjar hända saker på sidan som går förlorat om jag slänger upp min backup som jag gjorde innan jag började pilla i databasen.
Men om det inte är någon större skillnad så känns det bara onödigt. :)

138 ms totalt · 3 externa anrop · v20260731065814-full.02a0f7de
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)