Visual Studio – die neusten Beiträge

C# User Login: Passwort-Hash vergleichen?

Hallo,

ich programmiere eine Anwendung, in der man Adressen mit SQL-Server verwalten kann. Man kann Benutzer anlegen und sich mit denen beim Start der Anwendung einloggen.

Nun möchte ich das Passwort hashen. Beim Erstellen des Benutzers wird bereits ein Hashwert generiert und in der Passwort-Spalte in der Datenbank angezeigt. Beim Einloggen soll auch das Passwort gehasht werden und dann der Hash vom Einloggen mit dem aus der Datenbank auf Übereinstimmung verglichen werden.

Ich habe mich an folgendem Tutorial orientiert: https://dotnetcodr.com/2017/10/26/how-to-hash-passwords-with-a-salt-in-net-2/

Ich generiere also immer einen zufälligen Hashwert und das auch beim Einloggen. Wenn ich dann also den Hash vom Einloggen mit dem aus der Datenbank pvergleiche, können die nie übereinstimmen, weil eben bei beiden immer ein zufälliger Wert generiert wird.

Hash (beim Erstellen des Benutzers):

public HashWithSaltResult HashWithGenericSalt(string password, int saltLength, HashAlgorithm hashAlgo)
{
    RNG rng = new RNG();
    byte[] saltBytes = rng.GenerateRandomCryptographicBytes(saltLength);
    byte[] passwordAsBytes = Encoding.UTF8.GetBytes(password);
	List<byte> passwordWithSaltBytes = new List<byte>();

    passwordWithSaltBytes.AddRange(saltBytes);
    passwordWithSaltBytes.AddRange(passwordAsBytes);
    byte[] digestBytes = hashAlgo.ComputeHash(passwordWithSaltBytes.ToArray());

    return new HashWithSaltResult(Convert.ToBase64String(saltBytes), Convert.ToBase64String(digestBytes));
}

Hash (beim Einloggen):

public HashWithSaltResult HashWithSalt(string password, string salt, HashAlgorithm hashAlgo)
{
	// Wie hashe ich beim einloggen?
}

Einloggen:

using (var context = new PersonDbContext())
{
	var query = from p in context.Benutzers where textBoxVorname.Text == p.Vorname && textBoxName.Text == p.Name && HashResultSha512.Digest == p.PasswortDigest select p;
    HashPassword();
}

public void HashPassword()
{
    PasswordWithSaltHasher pwHasher = new PasswordWithSaltHasher();
    HashResultSha512 = pwHasher.HashWithSalt();

    db.CheckBenutzerLogin(textBoxVorname.Text, textBoxPasswort.Text, HashResultSha512.Salt, HashResultSha512.Digest);
}

Was muss ich in

public HashWithSaltResult HashWithSalt

schreiben, damit er den Hashwert aus der Datenbank verwendet und nicht wieder einen neuen Wert generiert?

SQL, programmieren, Passwort, Login, C Sharp, SQL-Server, Visual Studio

Wie kann ich mit einem C# Programm die Nullstellen einer quadratischen Gleichung ausrechnen?

Ich hab es so versucht, jedoch treten ständig fehler auf (a soll a sein , b b und c c, d soll die diskriminante sein, e die LF bzw. Mitternachtsformel mit -b+... und f -b-...)

Ich hoffe ihr findet meinen Fehler. double nthRoot = Math.Pow(d) soll übrigens die Wurzel aus d sein, dies abe ich aus einem Bericht aus dem Internet, jedoch wird mir dies auch immer als Fehler angezeigt.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Quadratische_Gleichung_lösen_Jakob
{

  public partial class Form1 : Form
  {
    double a, b, c;
    double n = 2;

    private void button1_Click(object sender, EventArgs e)
    {
      a = Convert.ToDouble(textBox1.Text);
      b = Convert.ToDouble(textBox2.Text);
      c = Convert.ToDouble(textBox3.Text);
      d = (b * b) - (4 * a * c);
      e = (-b + (double nthRoot = Math.Pow(d)/ (2 * a));
      f = (-b - (double nthRoot = Math.Pow(d)/ (2 * a));
    }
     
    double d, e, f;
    public Form1()
    {
      InitializeComponent();
      label1.Text = "a=";
      label2.Text = "b=";
      label3.Text = "c=";
      label4.Text = "x1=";
      label6.Text = "x2=";
      label5.Text = e.ToString();
      label7.Text = f.ToString();
    }
  }
}
Computer, Schule, Mathematik, programmieren, C Sharp, Visual Studio, microsoft visual studio

C# Datagridview/Datenbank bearbeiten mit Button?

Hallo, ich versuche gerade Einträge in einem Datagridview zu bearbeiten. Ich habe also das Datagridview, einen Bearbeiten Button und eine zweite Form die sich beim klicken auf den Bearbeiten Button öffnet. Ich wähle also einen Eintrag im Grid aus z.B. mit ID: 1 Vorname: Max Nachname: Mustermann. Dann steht im sich öffnenden Fenster nach dem klick auf bearbeiten die ID: 1 Vorname: Max Nachname: Mustermann alles in einer eigenen Textbox, genauso wie ich es haben will. Jetzt ist aber das Problem, wenn ich den Namen z.B. auf Musterfrau ändern will und auf Ok klicke ändert sich der Name im Grid nicht zu Musterfrau sondern bleibt unverändert bei Mustermann.

Bearbeiten Button in der ersten Form:

private void buttonBearbeiten_Click(object sender, EventArgs e)
		{
				var selectedRow = PersonDataGridView.SelectedRows[0];
				var selectedPerson = (Person)selectedRow.DataBoundItem;
            var dlg = new PersonDialog();

            dlg.BindPerson(selectedPerson);
            dlg.ShowDialog();

            if (dlg.DialogResult == DialogResult.OK)
            {
                var person = dlg._selectedPerson;
            
                //_db.EditPerson(person);
                _db.SaveChanges();
                
                füllen();
            }
        }
    }

DbContext:

public DbSet<Person> Personen { get; set; }
public void EditPerson(Person person)
		{
			//Wie bearbeite ich eine Person
            //Beim hinzufügen ist es ja z.B. Personen.Add()
		}

BindPerson-Methode und Ok Button in der zweiten Form(zweite Form wird nach klick auf Bearbeiten Button geöffnet):

public Person _selectedPerson;
    public void BindPerson(Person selectedPerson)
    {
        textBoxID.Text = selectedPerson.Id.ToString();
        textBoxVorname.Text = selectedPerson.Vorname;
        textBoxName.Text = selectedPerson.Name;
        textBoxStrasse.Text = selectedPerson.Straße;
        textBoxHausnummer.Text = selectedPerson.Hausnummer.ToString();
        textBoxWohnort.Text = selectedPerson.Wohnort;
        textBoxPLZ.Text = selectedPerson.PLZ.ToString();

        _selectedPerson = selectedPerson;
    }

    private void buttonOK_Click(object sender, EventArgs e)
    {
        var id = Convert.ToInt32(textBoxID.Text);
        var vorname = textBoxVorname.Text;
        var name = textBoxName.Text;
        var straße = textBoxStrasse.Text;
        int hausnummer = Convert.ToInt32(textBoxHausnummer.Text);
        var wohnort = textBoxWohnort.Text;
        int plz = Convert.ToInt32(textBoxPLZ.Text);

        _selectedPerson.Id = id;
        _selectedPerson.Vorname = vorname;
        _selectedPerson.Name = name;
        _selectedPerson.Straße = straße;
        _selectedPerson.Hausnummer = hausnummer;
        _selectedPerson.Wohnort = wohnort;
        _selectedPerson.PLZ = plz;

        Close();
    }

Was muss ich in meine EditPerson-Methode schreiben damit die Änderungen im Grid sichtbar sind?

Danke euch.

SQL, programmieren, C Sharp, Datenbank, Visual Studio

C# Abbrechen-Button?

Hallo, ich habe ein Problem mit meiner Anwendung. Ich habe eine Form die heißt z.B. Form1 und eine Form2. Beim klick auf den Hinzufügen-Button in Form1 öffnet sich Form2 (dort sollen dann Daten in Textboxen eingegeben). Wenn ich dann auf den Speichern-Button klicke werden diese eingegebenen Daten in eine Datenbank gespeichert und in einem Datagridview in Form1 angezeigt. Das Problem hierbei ist, der Abbrechen-Button in Form2 funktioniert nicht (beim klick auf den Abbrechen-Button soll man wieder zurück zu Form1 kommen). Ich habe eine Datenbank Kontext Klasse "PersonDbContext" in der zwei Methoden sind, einmal zum hinzufügen und einmal entfernen einer Person aus dem grid sowie Datenbank.

DbContext:

public class PersonDbContext : DbContext
	{
		public DbSet<Persons> Person { get; set; }
    public void AddPerson(Persons person)
    {
        Person.Add(person);
        SaveChanges();
        MessageBox.Show(@"Person wurde erfolgreich hinzugefügt.");
    }

    public void RemovePerson(Persons person)
    {
        Person.Attach(person);
        Entry(person).State = EntityState.Deleted;
        SaveChanges();

        MessageBox.Show(@"Person wurde erfolgreich gelöscht.");
    }
}

Form1:

private void buttonHinzufügen_Click(object sender, EventArgs e)
		{
			var dlg = new PersonDialog();
			dlg.ShowDialog();
			var person = dlg.Persons;
        _db.AddPerson(person);
        _db.SaveChanges();
    }

PersonDialog ist die 2. Form die sich dann öffnet (Form2).

Wenn ich auf meinen Abbrechen-Button in meiner 2. Form klicke bekomme ich immer den Fehler das der Wert nicht null sein darf.

Also im DbContext in der AddPerson-Methode heißt es dann der Wert darf nicht null sein (bei Person.Add(person);

public void AddPerson(Persons person)
		{
            //Wert darf nicht null sein.
    		Person.Add(person);
        SaveChanges();
        MessageBox.Show(@"Person wurde erfolgreich hinzugefügt.");
    }

Wenn ich aber eben keine Person hinzufügen will (keine Daten in Form2 eingeben will) ist es null. Ich muss sogesehen eine neue Person hinzufügen und die dann per Löschen-Button in Form1 wieder entfernen weil ich sonst ja die Exception kriege. Also wie bringe ich den Abbrechen-Button in Form2 zum laufen (damit es egal ist ob der Wert null ist bzw halt nichts eingegeben wurde)?

Danke euch. :)

Computer, SQL, programmieren, C Sharp, Datenbank, Visual Studio

C# - Ungültige Zeichenabstände und ungültige Länge der Daten?

Hallo, ich habe eine Xml-Datei, welche einen Benutzernamen sowie Passwort enthalt und eine Xml-Datei, welche auch einen Benutzernamen und Passwort enthält, nur ist dort das Passwort verschlüsselt.

Wenn ich die erstgenannte Xml-Datei öffne (Passwort nicht verschlüsselt) kommt der Fehler:

"System.Security.Cryptography.CryptographicException: Zeichenabstände sind ungültig und können nicht entfernt werden."

Wenn ich die andere Xml-Dazei öffne (Passwort verschlüsselt) kommt der Fehler:

"System.Security.Cryptography.CryptographicException: Die Länge der zu entschlüsselnden Daten ist ungültig."

Code zum entschlüsseln der Datei:

byte[] chiperbytes = File.ReadAllBytes(path);
                MemoryStream ms1 = new MemoryStream(chiperbytes);
                CryptoStream cs1 = new CryptoStream(ms1, desObj.CreateDecryptor(), CryptoStreamMode.Read);

                cs1.Read(chiperbytes, 0, chiperbytes.Length);
                plainbytes2 = ms1.ToArray();


                cs1.Close();
                ms1.Close();
                textBoxPasswort.Text = Encoding.ASCII.GetString(plainbytes2);

Code zum verschlüsseln:

cipherData = textBoxVerschlüsselung.Text;
					plainbytes = Encoding.ASCII.GetBytes(cipherData);
					plainKey = Encoding.ASCII.GetBytes("01234567890abcdef");
					desObj.Mode = CipherMode.CBC;
					desObj.Padding = PaddingMode.PKCS7;
					MemoryStream ms = new MemoryStream();
					CryptoStream cs = new CryptoStream(ms, desObj.CreateEncryptor(), CryptoStreamMode.Write);
					cs.Write(plainbytes, 0, plainbytes.Length);
					cs.Close();
					chiperbytes = ms.ToArray();
					ms.Close();
                textBoxVerschlüsselung.Text = Encoding.ASCII.GetString(chiperbytes);

Bitte helft einem Anfänger. :D

Danke.

Technik, programmieren, C Sharp, Technologie, Visual Studio

C# Delegaten/Invoke/Thread/Backgroundworker?

Huhu,

bin aktuell am rumexperimentieren, da ich es am lernen bin. Dieses Test Form hat nur 2 Dinge die es machen soll.

  1. Das Form Load wird mit einem Label gestartet um den Spieler zu begrüßen. Nach 2 bzw 3 Sekunden soll dass label unsichtbar werden mithilfe eines Backgroundworkes und delegaten. Alles startet normal. Nach den besagten paar Sekunden wirft er mir eine exeption. Als Grund nennt er mir immer das label1. Meine Vermutung ist, dass label 1 ja bereits Form1 Thread läuft und daher nicht mehr geändert werden kann über einen Backgroundworker.

Die Exeption lautet : Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement label1 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde."

  1. Der zweite Punkt wäre, dass bei einem Button click ein Fenster aufgehen soll und sich nach ein paar Sekunden wieder schließen soll. Das tut es auch. Drücke ich aber nochmal den Button, wirft er mir diese Exeption: System.ObjectDisposedException: "Auf das verworfene Objekt kann nicht zugegriffen werden.Objektname: "Skynet"."

Hier ist der Code:

Für den Kenner ist das bestimmt alles Kraut und Ruben. Kurz: Ein Chaos. Aber aktuell ist es eher Try and Error :)

 public partial class Form1 : Form

  {

    public delegate void invokeDelegate();

    //Backgroundworker wird initialisiert

    public BackgroundWorker arbeiter = new BackgroundWorker();

    public BackgroundWorker arbeiter2 = new BackgroundWorker();

    //Delegaten

    public delegate void deleWorker (BackgroundWorker a);

    public delegate void gruss(BackgroundWorker b);

    //Begrüßungsfenster

    Skynet hello = new Skynet();

    //Zeigt Skynet Fenster an

    public void Show()

    {

       hello.Show();

        Thread.Sleep(3000);

        this.hello.Close();

        hello.Dispose();

    }

    //Willkommensgruß wird für 2 Sekunden angezeigt

    private void Willkommensgruss(Label a)

    {

      a.Text = "Willkommen, Fremder.";

      Thread.Sleep(2000);

        }

    public Form1()

    {

      InitalizeComponent();

      arbeiter.DoWork += backgroundWorker1_DoWork;

      arbeiter2.DoWork += backgroundWorker2_DoWork;

      Skynet hello = new Skynet();

         }

    private void Form1_Load(object sender, EventArgs e)

    {

      //delegate

      gruss hallo = new gruss(backgroundWorker2.RunWorkerAsync);

        hallo.Invoke(backgroundWorker2);

    }

    //Öffnet Skynet Fenster

    private void button2_Click(object sender, EventArgs e)

    {

      deleWorker test = new deleWorker(backgroundWorker1.RunWorkerAsync);

      test.Invoke(backgroundWorker1);

    }

    //Backgroundworker 1

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)

    {

     Show();    

    }

    //Backgroundworker 2

    private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)

    {

    Willkommensgruss(label1);

    }

  }

}

Computer, programmieren, C Sharp, Visual Studio

c# bmi rechner mit absoluter zahl korrektes Ergebnis, mit Variable falsch warum?

Habe folgendes Problem, das hier ist der aus dem Code entscheidende Tei.. ich habe auch mal Schritt für Schritt alles durchlaufen lassen um alles nachzuvollziehen, komme aber immer noch nicht weiter.

Folgende Werte werden eingegeben, wie in dem Kommentar teil beschrieben:

Größe = 150cm

Gewicht = 45kg somit käme genau ein bmi von 20 raus da 1,5³ = 2,25 und 45 / 2,25 = 20

allerdings erscheint im textlabel 3 also der Ausgabezelle nach dem Klick auf den Button immer genau der Wert, den ich in das Gewichtsfeld eingetragen habe.

Wenn ich jedoch ((groesse / 100) * (groesse / 100)) durch 2.25 mal zu testzwecken manuell ersetze kommt das korrekte Ergebnis von 20 raus.

ich habe es auch schon mit zwischenschritten probiert. (groesse erst im meter umrechen, dann schon quadrieren und in der Ergebnisformal habe ich dann genauso wie bei dem Zahlenwert 2.25 nur eben als Variablenwert stehen, wie man es noch an den Variablen Deklarationen erkennen kann.

 private void button2_Click(object sender, EventArgs e)
    {
        int groesse;
        double groessem;
        double groessequadrat;

        double gewicht; 
        double bmi;
        
        groesse = int.Parse(textBox1.Text);
        gewicht = double.Parse(textBox2.Text);
        bmi = gewicht / ((groesse / 100) * (groesse / 100)); //20bmi = 45kg / ((150cm / 100) * (150cm / 100)) = [warum 45] 
        label3.Text = bmi.ToString(); 
    }

hat jemand eine Idee, war hier der Fehler sein könnte?

programmieren, absolut, C Sharp, Visual Studio, Variablen

Visual Studio Fehlercode 0x8000000A?

Hallo,

vorab entschuldige ich mich für meine vielleicht falschen Beschreibung, bin noch ein ziemlicher Anfänger was Programmier- und Designoberflächen betrifft. Ich versuche momentan ein Projekt, das mit Visual Basic 2010 erstellt wurde und aufgebaut wurde, mit der aktuellen Version von Visual Basic (Community 2015) zu laden. Das Laden des Projekts funktioniert zunächst auch einwandfrei, allerdings enthält das Projekt eine Designoberfläche, über die ich z.B. das Licht an- und ausschalten sollen könnte. Wenn ich versuche diese Oberfläche aufzurufen, erscheint immer folgende Fehlermeldung:

Die für diesen Vorgang erforderlichen Daten sind noch nicht verfügbar. (Ausnahme von HRESULT: 0x800000A)

Die Aufrufliste zeigt folgendes an:

bei Microsoft.VisualStudio.Designer.Interfaces.IVSMDCodeDomProvider.get_CodeDomProvider() bei Microsoft.VisualStudio.Shell.Design.Serialization.CodeDom.CodeDomDocDataAdapter.get_Provider() bei Microsoft.VisualStudio.Shell.Design.Serialization.CodeDom.CodeDomDocDataAdapter.get_CompileUnit() bei Microsoft.VisualStudio.Design.Serialization.CodeDom.VSCodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager serializationManager) bei Microsoft.VisualStudio.Design.Serialization.CodeDom.VSCodeDomDesignerLoader.DeferredLoadHandler.Microsoft.VisualStudio.TextManager.Interop.IVsTextBufferDataEvents.OnLoadCompleted(Int32 fReload)

Weiß jemand woran das liegt? Ich habe schon versucht das Projekt mit Visual Basic 2012 zu öffnen, das .NET Framework aktualisiert, alle Visual C++ Redistributables die neuer als die 2010 Version sind deinstalliert und auch alle schon neu installiert. Außerdem habe ich sowohl bei meinem PC als auch auf meinem Laptop dieselbe Fehlermeldung, weshalb ich irgendwelche Komplikationen mit Fremdprogrammen o.ä. beinahe ausschließen kann.

Gruß

P.S.: Ich benutze Windows 7 64bit

Microsoft, Designer, programmieren, Visual Studio, Fehlermeldung

Visual Basic 2013 .CSV datei auslesen und editieren

Hallo zusammen, ich möchte, wie im titel schon sichtlich, einfach eine .csv Datei auslesen und diese auch bearbeiten können. Die CSV-Datei ist mit , getrennt und würde z.B. so aussehen:

"Name","TID","Resource","Percentage","Icon","IconExportName"
"String","String","String","int","String","String"
"Min","TID_RESOURCE_10","XP",10,"ic/custom.sc","icon_xp_small"
"Keks","TID_RESOURCE_50","XP",50,"ic/custom.sc","icon_xp_medium"
"Max","TID_RESOURCE_FULL","XP",100,"ic/custom.sc","icon_xp_big"

Das ist nun ein Beispiel welches alle möglichen formen beinhaltet, die ich benötige. Getrennt mit , und Werte innerhalb von " aber auch ohne!

Jetzt bleibt nur die Frage, wie lese ich diese beispiel.csv aus und kann sie in meiner Form bearbeiten?! (Der Pfad wird natürlich einfach bestimmt "C:\CSV-DateiOrdner\csvdatei.csv")

Zeile 1 gibt die Namen der darunter aufgelisteten werte an und somit auch die gerde benötigten Spalten. Zeile 2 kann einfach ignoriert werden oder als ToolTip über die ersten Werte (Titel) gelegt werden. (Zur not kann man die auch mit in die Tabelle einbinden - die höhe dieser Zellen kann man ja verkleinern und als untertitel bezeichnen) Die Restlichen Zeilen geben natürlich jeweils den rest an, also die Werte der zum Titel gehörigen option/Spalte.

Ich hoffe ich habe nun nichts vergessen zu sagen und es ist verständlich genug. Ich bin dankbar für Codes &-beispiele oder auch vernünftige Tutorials.

(Keine aussagen wie " Nimm DataGridView und machs mit StreamReader" oder so ein Zeug !!! Wenn ich mir "denken" könnte wie es geht, würde ich nicht nach code beispielen o.ä. fragen.)

Gruß Patrick.

Visual Basic, programmieren, vb, Visual Studio, csv, Edit

C# : Zeilen auslesen und in Textdatei schreiben

Mein Programm funktioniert nicht...ich habe 4 Textdateien, die jeweils etwa 300 Zeilen mit nur einer kurzen Info je Zeile (Zb. Name), wobei Zeile 1 aus jeder Datei im Zusammenhang steht.

Nun brauche ich eine weitere Textdatei, die Zeile 1 aus Datei 1,2,3 und 4 nimmst und in einen kleinen Abschnitt schreibt. Dann Zeile 2 aus Datei 1,2,3 und 4 und einen weiteren Abschnitt mit den Infos

Mein Code bisher (C#, Windows Forms):

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.IO;

using System.Text;

using System.Threading;

using System.Linq;

using System.Windows.Forms;

namespace WindowsFormsApplication1

{

public partial class Programm4 : Form
{
    public Programm4()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        string pathOU = textBox1.Text;
        string pathCN = textBox2.Text;
        string pathVorname = textBox3.Text;
        string pathNachname = textBox4.Text;
        string pathNeu = textBox5.Text;
        string[] OUs = File.ReadAllLines(pathOU);
        string[] CNs = File.ReadAllLines(pathCN);
        string[] Vornamen = File.ReadAllLines(pathVorname);
        string[] Nachnamen = File.ReadAllLines(pathNachname);
        string[] FertigeDatensätze;

        for (int i = 0; i < OUs.Count(); i++)
        {
            FertigeDatensätze[i] = "dn: cm=" + CNs[i] + ",ou=" + OUs[i] + ",ou=Extern,o=CLAAS\nobjectClass: Top\nobjectClass: claasUserExtension\nobjectClass: Person\nobjectClass: inetOrgPerson\nobjectClass: organizationalPerson\nobjectClass: ndsLoginProperties\nclaasUserType: extern\nmail: " + CNs[i] + "\ngivenName: " + Vornamen[i] + "\nfullName: " + Vornamen[i] + " " + Nachnamen[i] + "\nsn: " + Nachnamen[i] + "\nclaasApplRoleNames: cn=CDEX_EXTERN,ou=CDEX,ou=EBApps,o=CLAAS\nPassword: \n\n";
        }
        File.WriteAllText(pathNeu, FertigeDatensätze);
    }
}

}

Bild zum Beitrag
Computer, Microsoft, Windows 7, Programm, programmieren, C Sharp, Visual Studio

Meistgelesene Beiträge zum Thema Visual Studio