2011-10-03 3 views
2
사용자가 등록 할 때이 암호를 해시 이대로가 로그인시의 비교 값을 해시 동일한 기능을 사용하고

:잘못 간 해싱

Public Shared Function Compute(ByVal text As String, ByVal algorithm As String, Optional ByVal salt() As Byte = Nothing) As String 
    If salt Is Nothing Then 
     Dim saltSize As Integer = 8 
     salt = New Byte(saltSize - 1) {} 

     Dim rng As New RNGCryptoServiceProvider 
     rng.GetNonZeroBytes(salt) 
    End If 

    Dim textBytes As Byte() = Encoding.UTF8.GetBytes(text) 
    Dim saltedTextBytes() As Byte = New Byte(textBytes.Length + salt.Length - 1) {} 
    For i As Integer = 0 To textBytes.Length - 1 
     saltedTextBytes(i) = textBytes(i) 
    Next i 

    For i As Integer = 0 To salt.Length - 1 
     saltedTextBytes(textBytes.Length + i) = salt(i) 
    Next i 

    Dim hash As HashAlgorithm 
    If algorithm Is Nothing Then 
     algorithm = "" 
    End If 

    Select Case algorithm.ToUpper 
     Case "SHA1" : hash = New SHA1Managed 
     Case "SHA256" : hash = New SHA256Managed 
     Case "SHA384" : hash = New SHA384Managed 
     Case "SHA512" : hash = New SHA512Managed 
     Case Else : hash = New MD5CryptoServiceProvider 
    End Select 

    Dim hashBytes As Byte() = hash.ComputeHash(saltedTextBytes) 
    Dim saltedHash() As Byte = New Byte(hashBytes.Length + salt.Length - 1) {} 
    For i As Integer = 0 To hashBytes.Length - 1 
     saltedHash(i) = hashBytes(i) 
    Next i 

    For i As Integer = 0 To salt.Length - 1 
     saltedHash(hashBytes.Length + i) = salt(i) 
    Next i 

    Dim hashValue As String = Convert.ToBase64String(saltedHash) 

    Return Left(hashValue, 36) 
End Function 

내 문제가 있음을 나는에 로그인 할 때 암호가이 함수에 의해 해시 된 계정은 해시 된 값이 일치하지 않습니다. 나는 한 걸음 건너 뛰는 것 같아.

여기에 사용자 계정 생성에 대한 코드입니다 :

내 문제와 관련이없는 여기에 포함되지 않은 많은 검사가 있습니다
 ' The email address needs to be valid 
     Dim pattern As String = "^(?("")("".+?""@)|(([0-9a-zA-Z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-zA-Z])@))(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,6}))$" 
     Dim match As Match = Regex.Match(txtEmail.Text, pattern) 
     If match.Success Then 
      'Hash the user's password before entering it into the database. 
      Dim pass As String = Crypt.Compute(txtPass.Text, "SHA512", Nothing) 

      ' Enter the information from the form into the database. 
      Dim sql As String = "INSERT INTO Users(Username, Password, EmailAddress) " & _ 
       "VALUES(@User, @Pass, @Email)" 
      Dim cmd As New SqlCommand(sql, conn) 
      cmd.Parameters.AddWithValue("@User", txtName.Text) 
      cmd.Parameters.AddWithValue("@Pass", pass) 
      cmd.Parameters.AddWithValue("@Email", txtEmail.Text) 

      conn.Open() 
      cmd.ExecuteNonQuery() 
      conn.Close() 
     Else 
      lblError.Text = "Invalid email address. Please correct." 
      lblError.ForeColor = Drawing.Color.Red 
     End If 

.

최대한 멀리 볼 수
  Dim pass As String = Crypt.Compute(txtPass.Text, "SHA512", Nothing) 

      Dim UserData As New DataSet 
      Dim UserAdapter As New SqlDataAdapter 
      UserAdapter.SelectCommand = New SqlCommand("SELECT * FROM Users " & _ 
                 "WHERE Username = @User AND Password = @Pass", conn) 
      UserAdapter.SelectCommand.Parameters.AddWithValue("@User", txtUser.Text) 
      UserAdapter.SelectCommand.Parameters.AddWithValue("@Pass", pass) 
      UserAdapter.Fill(UserData) 

      If UserData.Tables(0).Rows.Count <> 1 Then 
       lblError.Text = "Invalid username or password." 
       lblError.ForeColor = Drawing.Color.Red 
       Session("LoginAttempt") = CInt(Session("LoginAttempt")) + 1 
      Else 
       Session("LoggedIn") = True 
       Response.Redirect("Home.aspx") 
      End If 

, 내가 여기했던 해시에 차이가 없다 :

은 여기 내 사용자 로그인입니다.

누구에게 아이디어가 있습니까?

+0

참고 사항 : [ "비밀번호 인증을위한 일반적인 용도로 ** 소금은 일방 함수 **의 출력과 함께 저장됩니다"] (http://en.wikipedia.org/wiki/Salt_ % 28 암호화 29 %) – AakashM

+0

[보안 SE의이 q] (http://security.stackexchange.com/questions/3272/password-hashing-add-salt-pepper-or-is-salt-enough) 및 링크 from – AakashM

답변

3
  1. 당신이 테이블에 삽입하여 계정을 생성, 당신은 사용자 이름 txtName.Text를 사용하지만 txtUser.Text를 사용하는 자격 증명을 확인하면된다.
  2. 왜 무작위 소금을 사용하고 있습니까? 소금이 모든 암호화에 대해 동일해야합니까? 코드를 새 프로젝트에 붙여 넣었습니다. Compute 메서드를 동일한 암호로 두 번 연속 실행하면 두 가지 결과가 나타납니다. 분명히 작동하지 않습니다. Nothing 대신 소금 값을 전달하고 계정을 만들고 로그인을 비교하는 데 같은 소금을 사용하십시오. 여기에 작동하는 몇 가지 예제 코드는 다음과 같습니다

    Dim thePass As String = "MyPassword" 
    Dim theSalt As String = "salt" 
    
    Dim pass As String = Compute(thePass, "SHA512", Encoding.UTF8.GetBytes(theSalt)) 
    Console.WriteLine(pass) 
    Dim pass2 As String = Compute(thePass, "SHA512", Encoding.UTF8.GetBytes(theSalt)) 
    Console.WriteLine(pass2) 'pass and pass2 are identical 
    

희망이 도움이!

+0

번호 사용자 등록 및 사용자 로그인은 다른 페이지에서 처리됩니다. 다른 컨트롤 이름 일뿐입니다. – Ortund

+0

@Logan : 편집을 참조하십시오. 다른 점을 추가했습니다 :-) – mellamokb

+0

저는 8의 정적 소금 크기를 설정했지만 여전히 행운이 없습니다. 좋은 제안 비록 – Ortund

2

내가 실종하지 않는 한 (언어에 익숙하지 않은 경우), 소금을 저장하지 않아도됩니다.

확인을 위해 계정을 만들 때 사용한 것과 같은 소금을 사용해야합니다.

참고 : 모든 사용자 계정에 임의의 소금을 생성하거나 모든 계정에 고정 소금을 사용할 수 있습니다. 어떤 방법이든 작동합니다. 첫 번째 이론적으로 더 안전하지만, 소금이 충분히 길면 둘 다 실용적인 목적으로 괜찮습니다.