https://crackstation.net/hashing-security.htm
https://www.bentasker.co.uk/blog/security/201-why-you-should-be-asking-how-your-passwords-are-stored
Som jag sa i mina kommentarer är att hasha lösenord något som du förmodligen inte borde göra själv.
Några saker att notera:
- SHA1 rekommenderas inte för lösenord
- Lösenord bör vara saltade
- Du bör använda ett verifierat userstore-ramverk istället för att försöka skapa ditt eget, eftersom du sannolikt kommer att "göra det fel"
- Jag är säker på att det finns många fler
Med det sagt , för att utföra din specifika fråga, skulle du vilja ha något sånt här:
Users
----
userId
passwordHashed
passwordHashed lagrar en hashad version av användarens lösenord (lösenordet i ren text lagras aldrig någonstans i beständighet.)
för att kontrollera efter giltigt lösenord görs något i stil med detta:
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
För att infoga/uppdatera användarlösenord måste du se till att lagra det hashade lösenordet, inte lösenordet i vanlig text, som sådant;
INSERT INTO users(userId, passwordHashed)
VALUES (@userId, HASHBYTES('SHA1', @rawPassword)
eller
UPDATE users
SET passwordHased = HASHBYTES('SHA1', @rawPassword)
WHERE userId = @userId
EDIT:
insåg precis att du frågar hur man gör hash i C#, inte SQL. Du kan utföra följande (hämtat från Hashing med SHA1 Algoritm i C# ):
public string Hash(byte [] temp)
{
using (SHA1Managed sha1 = new SHA1Managed())
{
var hash = sha1.ComputeHash(temp);
return Convert.ToBase64String(hash);
}
}
Ditt kodavsnitt kan vara:
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);
Du bör också notera att du bör parametrisera dina parametrar till din lagrade procedur istället för att skicka dem på det sätt du är - vilket det verkar som att du redan har en separat fråga om det.