sql >> データベース >  >> RDS >> Sqlserver

SHA1 を使用して Sql Server 2008 でパスワードを暗号化する

    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

    コメントで述べたように、パスワードのハッシュは、おそらく自分で行うべきではありません。

    注意事項:

    • SHA1 はパスワードに推奨されません
    • パスワードはソルト化する必要があります
    • 「間違ったことをする」可能性が高いため、独自のフレームワークを作成するのではなく、検証済みのユーザーストア フレームワークを使用する必要があります
    • 他にもたくさんあると思います

    そうは言っても 、特定の質問を達成するには、次のようなものが必要です:

    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
    

    編集:

    SQL ではなく C# でハッシュを実行する方法を尋ねていることに気付きました。以下を実行できます (Hashing with 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);
    

    また、パラメーターをそのままの方法で渡すのではなく、パラメーターをストアド プロシージャにパラメーター化する必要があることにも注意してください。これに関しては、既に別の質問があるようです。




    1. MM / DD/YYYY形式の日付をMySQL日付に変換します

    2. Oracle:グループの最大値を取得しますか?

    3. mysqlクエリはphpmyadminで実行すると機能しますが、phpで実行するとエラーを返します

    4. Oracle PL/SQLで動的配列を宣言する