| Autor |
Beitrag |
Tester15224
Hält's aus hier
Beiträge: 7
|
Verfasst: Do 19.09.13 11:20
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:
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
Zuletzt bearbeitet von Tester15224 am Do 19.09.13 13:37, insgesamt 1-mal bearbeitet
|
|
Th69
      

Beiträge: 4803
Erhaltene Danke: 1060
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Do 19.09.13 12:23
Hallo und
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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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 
Hält's aus hier
Beiträge: 7
|
Verfasst: 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?  geht das genauso oder muss man da was beachten
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Do 19.09.13 14:51
Könntest du die Frage nochmal in verständlich wiederholen?
|
|
Tester15224 
Hält's aus hier
Beiträge: 7
|
Verfasst: 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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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 
Hält's aus hier
Beiträge: 7
|
Verfasst: Do 19.09.13 19:02
Danke, klappt alles 
|
|