Multidesk.be » Forums » ASP » Wachtwoorden geŽncrypteerd opslaan met ASP (gesloten)

Helpinformatie
Dit onderwerp werd gesloten.
Het is bijgevolg niet mogelijk er nog op te reageren.
  • Pagina
  • 1 van 1
  • RSS
  • Eerste ongelezen reactie
  • Plaats een reactie
  • Abonneer mij
  • Onderwerp sluiten
0 gasten lezen dit onderwerp.
^ Onderwerp geschreven door Ezio op donderdag 10 april 2014 om 10:10:53.
Ezio's avatar
Multiviteit: 973
  • Bewerken
  • Citeren
  • Reageren
  • Verwijderen
  • Waarschuw een crewlid
Hey,

Voor mijn webshop (eindwerk) zou ik de wachtwoorden van gebruikers geŽncrypteerd willen opslaan in de database. Ik doe dit met behulp van salting en hashing. De twee functies die dit mogelijk maken zijn deze:
CODE
  1. Public Shared Function encrypt(toEncrypt As String, ByVal salt As String) As String
  2.         toEncrypt &= salt
  3.         Dim encoder As New UnicodeEncoding
  4.         Dim ByteSourceText() As Byte = encoder.GetBytes(toEncrypt)
  5.         Dim sha256 As New SHA256CryptoServiceProvider
  6.         Dim ByteHash() As Byte = sha256.ComputeHash(ByteSourceText)
  7.         Return Convert.ToBase64String(ByteHash)
  8.     End Function
  9.  
  10.  
  11.     Public Shared Function genSalt() As String
  12.         Dim sb As New System.Text.StringBuilder
  13.         Dim chars() As String = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", _
  14.                "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "X", _
  15.                "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}
  16.         Dim upperBound As Integer = UBound(chars)
  17.         Randomize()
  18.         For x As Integer = 1 To 5
  19.             sb.Append(chars(Int(Rnd() * upperBound)))
  20.         Next
  21.  
  22.         Return sb.ToString
  23.     End Function


Als een klant zich gaat registreren doe ik vijf dingen:

  1. Ingevoerde gebruikersnaam, naam en e-mailadres wegschrijven naar een nieuw record in de databank

  2. Salt genereren met gensalt()

  3. Salt opslaan in de database in het veld 'SALT' van de gebruiker

  4. Hash berekenen met behulp van het ingegeven wachtwoord en salt

  5. Hash wegschrijven in het veld 'wachtwoord' van de gebruiker



Als een klant zich wil inloggen voer ik deze drie stappen uit:

  1. Salt opvragen van de ingevoerde gebruikersnaam

  2. Hash berekenen op basis van ingevoerde wachtwoord en het salt dat we stap 1 hebben opgevraagd

  3. Controleren als de hash gelijk is aan het veld 'wachtwoord' van de ingevoerde gebruiker



De registratie verloopt in mijn ogen vlekkeloos, maar wanneer een gebruiker probeert in te loggen komen we in de problemen. De hash die opnieuw berekend wordt is namelijk nooit gelijk aan het wachtwoordveld van de gebruiker.

Als een gebruiker zich registreert krijgt hij de keuze om nu al zijn adresgegevens in te voeren of bij de eerstvolgende bestelling. Hieronder zie je de code die uitgevoerd wordt wanneer hij later zijn adresgegevens wilt uitvoeren.
CODE
  1.  
  2.  Protected Sub btnLater_Click(sender As Object, e As EventArgs) Handles btnLater.Click
  3.  
  4.         Dim strSQL As String
  5.         'De gebruiker kiest om zijn adresgegevens pas later in te vullen
  6.  
  7.         'We schrijven alvast zijn Voornaam, achternaam, gebruikersnaam, email en gecodeerde wachtwoord weg
  8.         'Voor de codering maken we eerst het salt en dan de hash
  9.  
  10.         Dim strVoornaam As String
  11.         Dim strAchternaam As String
  12.         Dim strGebruikersnaam As String
  13.         Dim strEmail As String
  14.         Dim strWachtwoord As String
  15.  
  16.         strVoornaam = Session("Voornaam")
  17.         strAchternaam = Session("Achternaam")
  18.         strGebruikersnaam = Session("Gebruikersnaam")
  19.         strEmail = Session("Email")
  20.         strWachtwoord = Session("Wachtwoord")
  21.  
  22.         'Voornaam, achternaam, gebruikersnaam en Email toevoegen aant tabel
  23.  
  24.         strSQL = "INSERT INTO tblKlanten(Klant_Naam,Klant_Achternaam,Klant_login_naam,Klant_emailadres)"
  25.         strSQL &= " VALUES('" & strVoornaam & "','" & strAchternaam & "','" & strGebruikersnaam & "','" & strEmail & "')"
  26.  
  27.         sqldtsKlanten.InsertCommand = strSQL
  28.         sqldtsKlanten.Insert()
  29.  
  30.         'Salt genereren
  31.         Dim strSalt As String
  32.         strSalt = genSalt()
  33.  
  34.         'We slaan het salt op in de database
  35.  
  36.         strSQL = "UPDATE tblKlanten SET SALT='" & strSalt & "' WHERE Klant_login_naam = '" & strGebruikersnaam & "'"
  37.  
  38.  
  39.         sqldtsKlanten.InsertCommand = strSQL
  40.         sqldtsKlanten.Insert()
  41.  
  42.  
  43.  
  44.         'HASH genereren
  45.         Dim strHash As String
  46.         strHash = encrypt(strWachtwoord, strSalt)
  47.  
  48.         'HASH opslaan in het veld Wachtwoord
  49.         strSQL = "UPDATE tblKlanten SET Klant_login_wachtwoord='" & strHash & "' WHERE Klant_login_naam = '" & strGebruikersnaam & "'"
  50.  
  51.         sqldtsKlanten.InsertCommand = strSQL
  52.  
  53.         sqldtsKlanten.Insert()
  54.  
  55.  
  56.         'Doorsturen naar gebruikerspaneel
  57.  



Bij het inloggen gebeurt dit:

CODE
  1.  
  2. 'Authenticatie
  3.         '--------------
  4.  
  5.         'Stap 1) SALT opvragen van ingevoerde gebruiker
  6.         'Stap 2) HASH genereren van ingevoerde wachtwoord aan de hand van SALT (stap 1)
  7.         'Stap 3) Controleren als resultaat overeenkomt met hash in het veld 'wachtwoord' van de ingevoerde gebruiker
  8.  
  9.         Dim strGebruikersnaamLogin As String
  10.         strGebruikersnaamLogin = txtGebruikersnaam.Text
  11.         Dim strWachtwoordLogin As String
  12.         strWachtwoordLogin = txtWachtwoord.Text
  13.  
  14.         Dim strSQL As String
  15.         Dim sqlCon As New SqlConnection(ConfigurationManager.ConnectionStrings("cnnGamezilla").ConnectionString)
  16.         Dim sqlCMD As New SqlCommand
  17.         Dim strSalt As String
  18.         strSQL = "SELECT SALT FROM tblKlanten WHERE Klant_login_naam = '" & strGebruikersnaamLogin & "'"
  19.  
  20.         With sqlCMD
  21.             .CommandText = strSQL
  22.             .Connection = sqlCon
  23.         End With
  24.  
  25.         sqlCon.Open()
  26.  
  27.         strSalt = sqlCMD.ExecuteScalar
  28.  
  29.         sqlCon.Close()
  30.  
  31.         '------------------------------------------------------------------------------------------------------
  32.         Dim strHash As String
  33.         strHash = encrypt(strWachtwoordLogin, strSalt)
  34.  
  35.  
  36.         '-------------------------------------------------------------------------------------------------------
  37.         'HASH (wachtwoord) van gebruiker opvragen
  38.         Dim strWachtwoordGebruiker As String
  39.         strSQL = "SELECT Klant_login_wachtwoord FROM tblKlanten WHERE Klant_login_naam = '" & strGebruikersnaamLogin & "'"
  40.  
  41.         With sqlCMD
  42.             .Connection = sqlCon
  43.             .CommandText = strSQL
  44.         End With
  45.  
  46.         sqlCon.Open()
  47.  
  48.         strWachtwoordGebruiker = sqlCMD.ExecuteScalar
  49.  
  50.         sqlCon.Close()
  51.  
  52.  
  53.         If strHash = strWachtwoordGebruiker Then
  54.             '-> Doorsturen naar klantenpaneel
  55.         Else
  56.             lblMelding.Text = "De ingevoerde logingegevens zijn niet correct."
  57.         End If
  58.  
  59.     End Sub
  60.  


Alvast bedankt en PM me gerust als je het projectje wenst ;)


I'm a gamer because I don't have a life... I've chosen to have many
^ Reactie #1 geschreven door thekid op donderdag 10 april 2014 om 10:39:52.
thekid's avatar
Multiviteit: 5273
Moderator
  • Bewerken
  • Citeren
  • Reageren
  • Verwijderen
  • Waarschuw een crewlid

Randinformatie

[nitpick]het eerste wat ik denk is, hmmmm sql injection?

ik denk nl, dat een klant steeds kan inloggen dmv
CODE
  1. jan' or '1' = '1


die in dit geval van je sql statements hetvolgende maakt
CODE
  1.  
  2. SELECT SALT FROM tblKlanten WHERE Klant_login_naam = '" & strGebruikersnaamLogin & "'"
  3. SELECT SALT FROM tblKlanten WHERE Klant_login_naam = 'jan' or '1' = '1'"


dus kan je toch inloggen :)

dit kan je vermijden door bvb Parameters te gebruiken ipv de querystring volledig te typen, of door niet rechtstreeks gebruik te maken van waardes die via de textbox ingegeven worden (je kan die waardes bvb eerst correct escapen zodat zo'n ingave geen problemen geeft met je string concats)[/nitpick]


Verder, denk ik dat je op de goede weg zit, maar gaat het voor mij een stuk sneller om eens je code in te kijken :) dus pm :D
"Human beings make life so interesting. Do you know, that in a universe so full of wonders, they have managed to invent boredom." - Death in Hogfather
^ Reactie #2 geschreven door Ezio op donderdag 10 april 2014 om 11:17:06.
Ezio's avatar
Multiviteit: 973
  • Bewerken
  • Citeren
  • Reageren
  • Verwijderen
  • Waarschuw een crewlid
Thx voor de snelle feedback!
Had nog niet gedacht aan sql injection, maar zal er zeker wat aan doen! :)


EDIT

Heb het nu aangepast naar dit:
CODE
  1.  
  2. Dim strGebruikersnaam as string
  3. strGebruikersnaam = txtGebruikersnaam.text
  4. ...
  5. strSQL = "SELECT SALT FROM tblKlanten WHERE Klant_login_naam = @Gebruikersnaam"
  6.  
  7. with sqlcmd
  8.     .Connection = sqlcon
  9.     .Commandtext = strSQL
  10.     .Paramters.AddWithValue("@Gebruikersnaam",strGebruikersnaamLogin)
  11. End With
  12. ...
  13.  


Ben ik nu volledig beschermd tegen SQL injection? :)
Deze tekst werd het laatst bewerkt voor 66.72 % door Ezio op donderdag 10 april 2014 om 11:34:19.
I'm a gamer because I don't have a life... I've chosen to have many
^ Reactie #3 geschreven door thekid op donderdag 10 april 2014 om 12:23:42.
thekid's avatar
Multiviteit: 5273
Moderator
  • Bewerken
  • Citeren
  • Reageren
  • Verwijderen
  • Waarschuw een crewlid
indien je het bij iedere insert, select, update en delete toepast :)

verder is het niet slecht om eerst een gebruikersnaam te controleren op verboden tekens

aangezien je wachtwoord "gesalted" is, heeft deze bvb geen gevaar voor injection

Verder, moet je nu ook eens kijken, of je dankzij de Parameters nu kunt wel kunt inloggen met een nieuwe gebruiker, het kan zijn dat je eerste versie de waardes verkeerd bewaarde of anders uitleest.

Heb je trouwens al eens een vergelijking gezet wat je terugkrijgt van je hash?
"Human beings make life so interesting. Do you know, that in a universe so full of wonders, they have managed to invent boredom." - Death in Hogfather
^ Reactie #4 geschreven door Ezio op donderdag 10 april 2014 om 13:48:30.
Ezio's avatar
Multiviteit: 973
  • Bewerken
  • Citeren
  • Reageren
  • Verwijderen
  • Waarschuw een crewlid
Zal dan validatie instellen voor gebruikersnaam :)

Nu heb ik het opnieuw getest en helaas werkt het nog steeds niet :(
Heb de code al eens gevolgd via breakpoints en begrijp nog steeds niet waarom het niet werkt, de hash wordt nochtans telkens op dezelfde manier berekend (gebruikersnaam + salt).

Gebruiker registreren:

http://i61.tinypic.com/24xpdau.png


Gebruiker inloggen:

http://i61.tinypic.com/bdc1s.png

I'm a gamer because I don't have a life... I've chosen to have many
^ Reactie #5 geschreven door thekid op donderdag 10 april 2014 om 14:10:03.
thekid's avatar
Multiviteit: 5273
Moderator
  • Bewerken
  • Citeren
  • Reageren
  • Verwijderen
  • Waarschuw een crewlid
lol

het probleem is hoe het salt veld beschreven is

ik vermoed dat je een vaste lengte van x aantal tekens hebt toegewezen wanneer je het veld aangemaakt hebt in je database :)

bij het bewaren geef je volgende salt door

salt = 'EbHgN'

en bij het ophalen bekom je het volgende
salt = 'EbHgN '

zie je de toegevoegde spaties in salt waarde? :)

deze extra spaties klopt je hash dan ook niet meer

oplossing:
- maak je salt waarde zolang als definieert in database veld
- doe een Trim() op de terug gekregene salt waarde
- pas je database veld aan zodat je er een waarde met variabele lengte kan bewaren
Deze tekst werd het laatst bewerkt voor 4.23 % door thekid op donderdag 10 april 2014 om 14:10:31.
"Human beings make life so interesting. Do you know, that in a universe so full of wonders, they have managed to invent boredom." - Death in Hogfather
^ Reactie #6 geschreven door Ezio op donderdag 10 april 2014 om 15:34:09.
Ezio's avatar
Multiviteit: 973
  • Bewerken
  • Citeren
  • Reageren
  • Verwijderen
  • Waarschuw een crewlid
Inderdaad! Datatype stond op nvarchar(10), waardoor hij telkens 5 extra spaties toevoegde. Heb het gegevenstype aangepast en alles werkt nu perfect :D :D

ENORM bedankt, zonder jou ging ik nog laaaaaang mogen zoeken hebben! ;)

Wat mij betreft mag hier een slotje op :)
I'm a gamer because I don't have a life... I've chosen to have many
^ Reactie #7 geschreven door thekid op donderdag 10 april 2014 om 16:05:10.
thekid's avatar
Multiviteit: 5273
Moderator
  • Bewerken
  • Citeren
  • Reageren
  • Verwijderen
  • Waarschuw een crewlid
yup, graag gedaan

Opmerking van de crew

en slotje
thekid
"Human beings make life so interesting. Do you know, that in a universe so full of wonders, they have managed to invent boredom." - Death in Hogfather
  • Pagina
  • 1 van 1
  • RSS
  • Eerste ongelezen reactie
  • Plaats een reactie
  • Abonneer mij
  • Onderwerp sluiten