sql >> Databáze >  >> RDS >> Sqlserver

Šifrujte hesla na serveru SQL Server 2008 pomocí SHA1

Hesla hash a salt v jazyce 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

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.




  1. SQLSTATE[23000]:Porušení omezení integrity:1452 Nelze přidat nebo aktualizovat podřízený řádek:omezení cizího klíče se nezdaří

  2. Oracle získá čísla s rozsahem

  3. Jak zkontrolovat, zda existuje uživatel postgres?

  4. Mysql limit s příkazem in