Hash- und Salt-Passwörter in C#
https://crackstation.net/hashing-security.htm
https://www.bentasker.co.uk/blog/security/201-why-you-should-be-asking-how-your-passwords-are-stored
Wie ich in meinen Kommentaren gesagt habe, ist das Hashen von Passwörtern etwas, das Sie wahrscheinlich nicht selbst tun sollten.
Ein paar Dinge zu beachten:
- SHA1 wird für Passwörter nicht empfohlen
- Passwörter sollten gesalzen werden
- Sie sollten ein verifiziertes Userstore-Framework verwenden, anstatt zu versuchen, Ihr eigenes zu erstellen, da Sie es wahrscheinlich "falsch machen"
- Ich bin mir sicher, dass es noch viele mehr gibt
Davon abgesehen , um Ihre spezielle Frage zu beantworten, möchten Sie etwa Folgendes:
Users
----
userId
passwordHashed
passwordHashed speichert eine gehashte Version des Passworts des Benutzers (das Klartext-Passwort wird niemals dauerhaft irgendwo gespeichert.)
um nach einem gültigen Passwort zu suchen, wird so etwas gemacht:
ALTER procedure [dbo].[proc_UserLogin]
@userid varchar(20),
@password nvarchar(50)
As
declare
@ReturnVal varchar(500)
SET NOCOUNT ON
if exists(select userid,password from LoginManager where [email protected] and password=HASHBYTES('SHA1', @password))
set @ReturnVal='0|Logged in Successfully'
else
set @ReturnVal='1|Login Failed/Username does not exist'
select @ReturnVal
Beim Einfügen/Aktualisieren von Benutzerkennwörtern müssen Sie sicherstellen, dass das gehashte Kennwort gespeichert wird und nicht das Klartextkennwort als solches;
INSERT INTO users(userId, passwordHashed)
VALUES (@userId, HASHBYTES('SHA1', @rawPassword)
oder
UPDATE users
SET passwordHased = HASHBYTES('SHA1', @rawPassword)
WHERE userId = @userId
BEARBEITEN:
Ich habe gerade festgestellt, dass Sie fragen, wie Sie den Hash in C # und nicht in SQL ausführen können. Sie könnten Folgendes durchführen (entnommen aus Hashing mit SHA1 Algorithmus in C# ):
public string Hash(byte [] temp)
{
using (SHA1Managed sha1 = new SHA1Managed())
{
var hash = sha1.ComputeHash(temp);
return Convert.ToBase64String(hash);
}
}
Ihr Codeausschnitt könnte wie folgt aussehen:
conn.Open();
string query = "EXEC dbo.proc_UserLogin'" + username.Text+ "', '" + this.Hash(System.Text.Encoding.UTF8.GetBytes(password.Text))+"'";
OleDbCommand cmd = new OleDbCommand(query, conn);
Sie sollten auch beachten, dass Sie Ihre Parameter für Ihre gespeicherte Prozedur parametrisieren sollten, anstatt sie so zu übergeben, wie Sie es tun - was so aussieht, als hätten Sie diesbezüglich bereits eine separate Frage.