https://crackstation.net/hashing-security.htm
https://www.bentasker.co.uk/blog/security/201-why-you-should-be-asking-how-your-passwords-are-stored
Както посочих в коментарите си, хеширането на пароли е нещо, което вероятно не трябва да правите сами.
Няколко неща, които трябва да отбележите:
- SHA1 не се препоръчва за пароли
- Паролите трябва да бъдат осолени
- Трябва да използвате проверена рамка на userstore, вместо да се опитвате да създадете своя собствена, тъй като вероятно ще го „направите погрешно“
- Сигурен съм, че има много повече
Това се казва , за да изпълните конкретния си въпрос, бихте искали нещо подобно:
Users
----
userId
passwordHashed
passwordHashed съхранява хеширана версия на паролата на потребителя (паролата с обикновен текст никога не се съхранява никъде в постоянство.)
за проверка за валидна парола се прави нещо подобно:
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
За вмъкване/актуализиране на потребителски пароли трябва да се уверите, че съхранявате хешираната парола, а не паролата с обикновен текст като такава;
INSERT INTO users(userId, passwordHashed)
VALUES (@userId, HASHBYTES('SHA1', @rawPassword)
или
UPDATE users
SET passwordHased = HASHBYTES('SHA1', @rawPassword)
WHERE userId = @userId
РЕДАКТИРАНЕ:
току-що разбрах, че питате как да изпълните хеша в C#, а не в SQL. Можете да извършите следното (взето от Хеширане с SHA1 Алгоритъм в C# ):
public string Hash(byte [] temp)
{
using (SHA1Managed sha1 = new SHA1Managed())
{
var hash = sha1.ComputeHash(temp);
return Convert.ToBase64String(hash);
}
}
Вашият кодов фрагмент може да бъде:
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);
Трябва също така да отбележите, че трябва да параметризирате вашите параметри към вашата съхранена процедура, вместо да ги предавате по начина, по който сте - което изглежда, че вече имате отделен въпрос относно това.