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) { string smtpEmail = smtpUserNameTextBox.Text; string smtpPassword = smtpPasswordTextBox.Text; int smtpPort = (int)smtpPortNumericUD.Value; string smtpAddress = smtpAddressTextBox.Text;
Regex regex = new Regex(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$"); Match match = regex.Match(email);
foreach (DataRow row in loginsDataSet.Logins) { if (row.ItemArray[0].Equals(username)) { MessageBox.Show("Username already exists"); return; } }
if (password != confirmPass) { MessageBox.Show("Passwords do not match"); } else if (password.Length < 8) { MessageBox.Show("Password must be at least 8 characters long"); } else if (!match.Success) { MessageBox.Show("Invalid Email"); } else if (username == null) { MessageBox.Show("Must have Username"); } 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();
sha.ComputeHash(ASCIIEncoding.ASCII.GetBytes(password + registerEmail.Text));
byte[] result = sha.Hash;
StringBuilder strBuilder = new StringBuilder(); for (int i = 0; i < result.Length; i++) { 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) { string username = loginUserName.Text; string password = HashPass(loginPassword.Text);
foreach (DataRow row in loginsDataSet.Logins) { if (row.ItemArray[0].Equals(username) && row.ItemArray[1].Equals(password)) { loginUserName.Text = String.Empty; loginPassword.Text = String.Empty; MessageBox.Show("Login Success"); break; } else { MessageBox.Show("Username/Password incorrect"); break; } } } } } |
Moderiert von
Th69: 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 :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!