C# Passwort ändern und speichern?

Hey liebe Community,

ich habe mal eine Frage an alle CSharpler…

Ich möchte sehr gerne (als Test) eine einfache ConsoleApp erstellen. Wenn ich diese starte, soll ich ein Passwort eingeben, welches ich für den nächsten Start benötige. Ebenfalls möchte ich eine "Passwort ändern-Funktion" einfügen.

Mein Code (nicht fertig) ist folgender:

using System;
using System.IO;
using System.Threading;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Änderungen_speichern
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Title = "Änderungen speichern";
            //Hier soll ich aufgefordert werden, mein beim letzten Mal geändertes Passwort einzugeben
            string pfad = "Passwort.txt";
            FileStream fs = new FileStream(pfad, FileMode.Create, FileAccess.Write);
            StreamWriter sw = new StreamWriter(fs);
            Console.Write("Passwort auswählen: ");
            string newPassword = Console.ReadLine();
            sw.WriteLine("Folgendes Passwort wird für den nächsten Start benötigt: "+ newPassword);
            sw.Close();
            fs.Close();
        }
    }
}

Ich hoffe es kann mir wer helfen... Sollte was unklar sein, einfach fragen.

Danke im Voraus ;)

MfG

Ollig00

Computer, programmieren, Anwendungsentwicklung, C Sharp
C# System.ObjectDisposedException Wie beheben?

Guten Tag,

ich programmiere derzeit ein C# Programm das erstmals rein als Task startet, sprich nur ein Icon in Windows in der Taskleiste angezeigt wird.

Ich habe dort ein Button mit Settings, was ein Fenster öffnet.

Diese Funktion

public static MainFrm configWindow = new MainFrm();
        void Settings(object sender, EventArgs e)
        {
                if (configWindow.Visible)
                    configWindow.Activate();
                else
                    configWindow.Show();
        }

Das Fenster schließe ich dann letztendlich mit

CstmAppContext.configWindow.Dispose();

Scheinbar reicht dies nicht aus und ich erhalte einen Fehlermeldung zu ObjectDispoosedException

System.ObjectDisposedException
  HResult=0x80131622
  Nachricht = Auf das verworfene Objekt kann nicht zugegriffen werden.
Objektname: "MainFrm".
  Quelle = System.Windows.Forms
  Stapelüberwachung:
   bei System.Windows.Forms.Control.CreateHandle()
   bei System.Windows.Forms.Form.CreateHandle()
   bei System.Windows.Forms.Control.get_Handle()
   bei System.Windows.Forms.Control.SetVisibleCore(Boolean value)
   bei System.Windows.Forms.Form.SetVisibleCore(Boolean value)
   bei System.Windows.Forms.Control.Show()
   bei PwdGenator.CstmAppContext.Settings(Object sender, EventArgs e) in C:\Users\pjhnn\source\repos\PwdGenator\PwdGenator\CstmAppContext.cs: Zeile51
   bei System.Windows.Forms.MenuItem.OnClick(EventArgs e)
   bei System.Windows.Forms.MenuItem.MenuItemData.Execute()
   bei System.Windows.Forms.Command.Invoke()
   bei System.Windows.Forms.Command.DispatchID(Int32 id)
   bei System.Windows.Forms.NotifyIcon.WndProc(Message& msg)
   bei System.Windows.Forms.NotifyIcon.NotifyIconNativeWindow.WndProc(Message& m)
   bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
   bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   bei System.Windows.Forms.Application.Run(ApplicationContext context)
   bei PwdGenator.Program.Main() in 
PwdGenator\PwdGenator\Program.cs: Zeile19

Dieser Fehler trifft bei der zeile

configWindow.Show();

auf.

Wo liegt den mein Fehler?

Ich habe die MainFrm configWindow schon auf public static gesetzt um in der Form direkt auf die Variable zuzugreifen, leider hilft das nicht weiter

Computer, Technik, programmieren, C Sharp, Technologie, Spiele und Gaming
C# Bankkonto, Hilfe?

Ich soll ein Programm erstellen, dass aus Nummer, Saldo und Passwort besteht. Einzahlung und Auszahlung sollten möglich sein, beim falschen Passwort oder zu hohem Betrag (überschreiten des Saldos) soll ebenso eine Fehlermeldung erscheinen.

Ich glaube, dass getter und setter benötigt werden, aber ich weiß gerade nicht weiter. Ich habe auch einige Fehler drin, weiß aber nicht genau, wie ich diese verbessern kann. Außerdem weiß ich leider nicht, wie ich in Main die Auszahlungen und Einzahlungen durchführen kann. Ich würde mich sehr freuen und wäre sehr dankbar, wenn mit jemand helfen könnte. Vielen dank!

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Konto

{

  class Konto

  {

    private int nummer;

    private double saldo;

    private string passwort;

    //Customkonstruktor, der Klasse Konto enthält  

    private Konto (int nummer, double saldo, string passwort)

    {

      this.nummer = nummer; 

      this.saldo = saldo;

      this.passwort = passwort;

    }

    //Customkonstruktor: Nummer = Wert zuweisen, Saldo = nullsetzen, Passwort = default

    private Konto(int nummer, double saldo, string passwort)

    {

      nummer = 123456;

      saldo = 0;

      passwort = (); 

    }

    //Methode "Einzahlen", hier wird der entsprechende Beitrag ausgegeben

    private void einzahlen(int einzahlungsbetrag)

    {

      saldo = saldo + einzahlungsbetrag;

      Console.WriteLine("Sie haben" + einzahlungsbetrag + "EUR eingezahlt");

    }

    //Methode "Auszahlen", ausgezahlt werden soll nur, wenn das Passwort richtig eingegeben wurde 

    //und wenn der gewünschte Betrag nicht höher ist als der aktuelle Kontostand, sonst ist die Auszahlung nicht möglich 

    // bei falschem Passwort soll ausgegeben werden = falsches Passwort 

    private void auszahlen(int auszahlungsbetrag, bool passwort)

    {

      if (passwort == false && auszahlungsbetrag > saldo)

      {

        Console.WriteLine("falsches Passwort");

      }

      else 

      {

        Console.WriteLine("Ihr Auszahlungsbetrag" + saldo); 

      }

    //Methode getInfo, die Kontonummer und Saldo ausgibt 

      private void getInfo(int nummer, double saldo)

      {

      Console.WriteLine("Ihre Kontonummer" + nummer + "und Ihr Saldo beträgt" + saldo); 

      }

    }

  }

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Konto

{

  class Program

  {

    static void Main(string[] args)

    {

      Konto einzahlen = new Konto(234);

      Konto auszahlen = new Konto(234.00);

 }

  }

}

Computer, Lernen, Programm, programmieren, Bankkonto, C Sharp, Quellcode
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

Meistgelesene Beiträge zum Thema C Sharp