none
Hash RRS feed

  • Pergunta

  • Boa tarde,

    possuo uma base de dados, sendo utilizada por uma aplicação Web em Asp.Net, onde a senha dos usuários é guardada em Hash, usando o método FormsAuthentication.HashPasswordForStoringInConfigFile do tipo sha1.

     

    Porém estou criando uma aplicação Windows Forms, que necessita logar no mesmo banco, e para isso estou usando o método

    System.Security.Cryptography.SHA1CryptoServiceProvider para comparar a senha digitada com a senha do banco de dados, pois não consegui usar o mesmo método utilizado na plataforma Web. 

     

    O problema é que o Hash gerado tá ficando diferente. O que tá errado?

    quarta-feira, 4 de abril de 2007 19:41

Respostas

  • O método em ASP.NET formata os bytes para hexadecimal antes de retornar a string. Você deve fazer a mesma coisa:

     

    Dim sha1 As New System.Security.Cryptography.SHA1CryptoServiceProvider
    Dim sha1Bytes As Byte()
    Dim encoder As New System.Text.UTF8Encoding()
    Dim saida As String = String.Empty
    Dim b As Byte
    sha1Bytes = sha1.ComputeHash(encoder.GetBytes(Me._usuSenha))
    For Each b In sha1Bytes
        saida &= b.ToString("X2") ' <-- Formata para hexa de dois dígitos.
    Next b
    Me._usuSenha = saida

     

     

    quarta-feira, 4 de abril de 2007 20:49

Todas as Respostas

  • Dá pra postar essa parte do código?
    quarta-feira, 4 de abril de 2007 19:55
  • Em Asp.Net, quando gravo o usuário:

     

    Dim anyParams() As SqlParameter = New SqlParameter(4) {}

    anyParams(0) = New SqlParameter("@funCodigo", _funCodigo)

    anyParams(1) = New SqlParameter("@usuLogin", _usuLogin)

    anyParams(2) = New SqlParameter("@usuSenha", FormsAuthentication.HashPasswordForStoringInConfigFile(_usuSenha, "sha1"))

    anyParams(3) = New SqlParameter("@nivCodigo", _nivCodigo)

    anyParams(4) = New SqlParameter("@usuStatus", usuStatus)

     

    Na aplicação Windows, quando faço o hash:

     

    Dim sha1 As New System.Security.Cryptography.SHA1CryptoServiceProvider

    Dim sha1Bytes As Byte()

    Dim encoder As New System.Text.UTF8Encoding()

    Dim saida As String

    Dim b As Byte

    sha1Bytes = sha1.ComputeHash(encoder.GetBytes(Me._usuSenha))

    For Each b In sha1Bytes

    saida &= b

    Next b

    Me._usuSenha = saida

     

    Só que o valor do Hash fica totalmente diferente do que tá no banco, pro mesmo valor digitado.

    quarta-feira, 4 de abril de 2007 19:59
  • Tenta fazer assim:

     

    saida = encoder.GetString(sha1Bytes)

     

    Ao invés de ir concatenando os valores.

    quarta-feira, 4 de abril de 2007 20:12
  • Ficaram uns caracteres muito loucos, tipo    "#}yʈddcEQ9d"
    quarta-feira, 4 de abril de 2007 20:18
  • O método em ASP.NET formata os bytes para hexadecimal antes de retornar a string. Você deve fazer a mesma coisa:

     

    Dim sha1 As New System.Security.Cryptography.SHA1CryptoServiceProvider
    Dim sha1Bytes As Byte()
    Dim encoder As New System.Text.UTF8Encoding()
    Dim saida As String = String.Empty
    Dim b As Byte
    sha1Bytes = sha1.ComputeHash(encoder.GetBytes(Me._usuSenha))
    For Each b In sha1Bytes
        saida &= b.ToString("X2") ' <-- Formata para hexa de dois dígitos.
    Next b
    Me._usuSenha = saida

     

     

    quarta-feira, 4 de abril de 2007 20:49
  • Exatamente, na mosca.

     

    Valeu pela ajuda.

    quinta-feira, 5 de abril de 2007 14:29