Entwickler-Ecke

WinForms - Probleme mit Login Button


Tester15224 - Do 19.09.13 11:20
Titel: Probleme mit Login Button
Habe folgendes Problem. Habe nen Login und Registrier Bereich. Passwort wird "sicher" gemacht, aber wie kann ich es rückgängig machen um es mit der eingabe zu vergleichen?

vielleicht findet ja jemand den fehler :(

Hier der code:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;
using System.Net;
using System.Net.Mail;
using System.Security.Cryptography;


namespace WindowsForms1000
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void AddUser(string username, string password, string confirmPass, string email)
        {
            //Local variables to hold values
            string smtpEmail = smtpUserNameTextBox.Text;
            string smtpPassword = smtpPasswordTextBox.Text;
            int smtpPort = (int)smtpPortNumericUD.Value;
            string smtpAddress = smtpAddressTextBox.Text;

            //Regex for making sure Email is valid
            Regex regex = new Regex(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$");
            Match match = regex.Match(email);

            //Loop through Logins Table
            foreach (DataRow row in loginsDataSet.Logins)
            {
                //And look for matching usernames
                if (row.ItemArray[0].Equals(username))
                {
                    //If one is found, show message:
                    MessageBox.Show("Username already exists");
                    return;
                }
            }

            //Confirm pass must equal password.
            if (password != confirmPass)
            {
                MessageBox.Show("Passwords do not match");
            }
            //Password must be at least 8 characters long
            else if (password.Length < 8)
            {
                MessageBox.Show("Password must be at least 8 characters long");
            }
            //If email is NOT valid
            else if (!match.Success)
            {
                MessageBox.Show("Invalid Email");
            }
            //If there is no username
            else if (username == null)
            {
                MessageBox.Show("Must have Username");
            }
            //If all is well, create the new user!
            else
            {
                loginsDataSet.LoginsRow newUserRow = loginsDataSet.Logins.NewLoginsRow();

                string EncryptedPass = HashPass(password);
                newUserRow.Username = username;
                newUserRow.Passwort = EncryptedPass;
                newUserRow.Email = email;

                loginsDataSet.Logins.Rows.Add(newUserRow);
                registerUserName.Text = String.Empty;
                registerPassword.Text = String.Empty;
                registerConfirmPassword.Text = String.Empty;
                registerEmail.Text = String.Empty;
                MessageBox.Show("Thank you for Registering!");
                if (String.IsNullOrWhiteSpace(smtpEmail) || String.IsNullOrWhiteSpace(smtpPassword) || String.IsNullOrWhiteSpace(smtpAddress) || smtpPort <= 0)
                {
                    MessageBox.Show("Email configuration is not set up correctly! \nCannot sent email!");

                }
                else
                {
                    SendMessage(email.ToString(), username.ToString(), password.ToString());
                }
            }
        }
        public string HashPass(string password)
        {
            SHA256 sha = new SHA256CryptoServiceProvider();

            //compute hash from the bytes of text
            sha.ComputeHash(ASCIIEncoding.ASCII.GetBytes(password + registerEmail.Text));

            //get hash result after compute it
            byte[] result = sha.Hash;

            StringBuilder strBuilder = new StringBuilder();
            for (int i = 0; i < result.Length; i++)
            {
                //change it into 2 hexadecimal digits
                //for each byte
                strBuilder.Append(result[i].ToString("x2"));
            }

            return strBuilder.ToString();
        }

        public void SendMessage(string ToAddress, string ToName, string password)
        {

            var client = new SmtpClient(smtpAddressTextBox.Text, (int)smtpPortNumericUD.Value)
            {
                Credentials = new NetworkCredential(smtpUserNameTextBox.Text, smtpPasswordTextBox.Text),
                EnableSsl = true
            };
            client.Send(smtpUserNameTextBox.Text, ToAddress, "Thank You!""Thank you for registering with us today! \n Your username/passwords are: \n \nUsername: "
                                                                        + ToName.ToString() + "\nPassword: " + password.ToString());
        }

        private void registerButton_Click(object sender, EventArgs e)
        {
            AddUser(registerUserName.Text, registerPassword.Text, registerConfirmPassword.Text, registerEmail.Text);
        }

        private void loginButton_Click(object sender, EventArgs e)
        {
            //Locals to hold values
            string username = loginUserName.Text;
            string password = HashPass(loginPassword.Text);


            //Loop through database
            foreach (DataRow row in loginsDataSet.Logins)
            {
                //And search for Username and Pass that match
                if (row.ItemArray[0].Equals(username) && row.ItemArray[1].Equals(password))
                {
                    loginUserName.Text = String.Empty;
                    loginPassword.Text = String.Empty;
                    MessageBox.Show("Login Success");
                    break;
                }
                //If not, then show this message.
                else
                {
                    MessageBox.Show("Username/Password incorrect");
                    break;
                }
            }
        }
    }
}


Moderiert von user profile iconTh69: Code- durch C#-Tags ersetzt


Th69 - Do 19.09.13 12:23

Hallo und :welcome:

zuersteinmal ein paar Förmlichkeiten:
- bitte editere deinen Beitrag und gib dem Thema einen vernünftigen Titel
- uns einfach den Code zu posten und dann nur "vielleicht findet ja jemand den fehler" zu schreiben, ist nicht im Sinne eines (bzw. dieses) Forums

So nun aber zum Code:
wenn du speichern willst, so mußt du dann auch die entsprechende Methode des DataSets bzw. der DataTable aufrufen: AcceptChanges().


Ralf Jansen - Do 19.09.13 13:13

Ein DataSet ist eine reine In-Memory Geschichte wenn du das ganze irgendwohin speichern willst mußt du das auch explizit tun.

Da du scheinbar ein typisiertes Dataset benutzt solltest du auch typisierte DataAdapter geniert haben über die du die Daten in der DB ablegen und wieder rausholen kannst.
Falls da keine Datenbank hinter liegt und du das Dataset manuell zusammengeschraubt hast sieh dir die ReadXML/WriteXML Methoden des Datasets an um die Daten in ein File wegzuschreiben.

PS. Generiere den Hash nicht nur aus dem Passwort sondern zusammen mit dem Usernamen (und am besten auch mit einem konstanten zufälligen Salt). Es ist sehr auffällig wenn wenn jemand deine DB in die Hände bekommen sollte und unterschiedliche User den gleichen Passworthash haben. Ich sollte genauer lesen.


Tester15224 - Do 19.09.13 13:36

Okay, schonmal danke für den Hinweis.

Okay komm ich mach jetzt direkt zur Sache. Habe ja den Code zum sicher machen schon da, aber wie kann ich es wieder rückgängig machen? :D geht das genauso oder muss man da was beachten


Ralf Jansen - Do 19.09.13 14:51

Könntest du die Frage nochmal in verständlich wiederholen?


Tester15224 - Do 19.09.13 17:10

Ja natürlich ;)

habe da ja ne methode "HashPass" da wird das passwort ja codiert. Nur wird es dann auch so benutzt und nicht mehr entcodiert. wie mache ich das?
hoffe das konnte es klarer machen


Ralf Jansen - Do 19.09.13 17:18

Hash sind eine Einweggeschichte. Darum benutzt man die ja.

Wenn jemand sein Passwort beim Login eingibt benutzt du den selben Algo um ebenfalls denn Hash dafür zu generieren und vergleichst dann denn mit dem gespeicherten Hashcode. Du vergleichst also die Hashcodes nicht das Passwort mit einem aus einem Hash dekodierten Passwort(nochmal dekodieren geht nicht).


Tester15224 - Do 19.09.13 19:02

Danke, klappt alles :)