https://crackstation.net/hashing-security.htm
https://www.bentasker.co.uk/blog/security/201-why-you-should-be-asking-how-your-passwords-are-stored
Jak jsem uvedl ve svých komentářích, hašování hesel je něco, co byste sami pravděpodobně dělat neměli.
Několik poznámek:
- SHA1 se pro hesla nedoporučuje
- Hesla by měla být osolená
- Měli byste raději použít ověřený framework userstore, než se pokoušet vytvořit svůj vlastní, protože to pravděpodobně „uděláte špatně“
- Jsem si jistý, že jich je mnohem více
To bylo řečeno , abyste splnili svou konkrétní otázku, chtěli byste něco takového:
Users
----
userId
passwordHashed
passwordHashed ukládá hašovanou verzi hesla uživatele (heslo ve formátu prostého textu není nikdy nikde trvale uloženo.)
pro kontrolu platného hesla se dělá něco takového:
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
Pro vkládání/aktualizaci uživatelských hesel se musíte ujistit, že ukládáte hashované heslo, nikoli heslo ve formátu prostého textu jako takové;
INSERT INTO users(userId, passwordHashed)
VALUES (@userId, HASHBYTES('SHA1', @rawPassword)
nebo
UPDATE users
SET passwordHased = HASHBYTES('SHA1', @rawPassword)
WHERE userId = @userId
EDIT:
právě si uvědomil, že se ptáte, jak provést hash v C#, ne v SQL. Můžete provést následující (převzato z hašování pomocí SHA1 Algoritmus v C# ):
public string Hash(byte [] temp)
{
using (SHA1Managed sha1 = new SHA1Managed())
{
var hash = sha1.ComputeHash(temp);
return Convert.ToBase64String(hash);
}
}
Váš výstřižek kódu může být:
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);
Měli byste také poznamenat, že byste měli parametrizovat své parametry vaší uložené proceduře, spíše než je předávat způsobem, jakým jste – což vypadá, že už máte v této věci samostatnou otázku.