O padrão HashAlgorithmType da associação do ASP.NET é HMACSHA256; portanto, o hash da senha é digitado?
Eu tenho um aplicativo Web ASP.NET 4.5 que usa umSqlMembershipProvider
. Durante o desenvolvimento, alguém colocoupasswordFormat="Clear"
na configuração, fazendo com que as senhas sejam salvas em texto não criptografado. Quero remover isso e ativar o hash de senhas, mas quero garantir que os hashes não estejam sendo gerados usando uma chave específica da máquina ou gerada automaticamente.
De acordo com o que li em todas as perguntas e respostas relacionadas, as senhas são simplesmente divididas em hash usando o SHA256 direto e não são específicas da máquina ou codificadas. No entanto, quando eu checo o Membership.HashAlgorithmType em tempo de execução, seu valor é "HMACSHA256" e o .NETHMACSHA256
classe requer uma chave (porque é HMAC) e gera uma aleatoriamente, se uma não for fornecida ao construtor. Então parece que deve haver uma chave envolvida. Então, o hash da senha de associação é digitado ou não? Se for, como uso a mesma chave nas máquinas? Documentação ou evidência que suporte sua resposta serão apreciadas.
Editar
De acordo comesta página do MSDN em "Protegendo a associação", o elemento machineKeyfaz controle a chave de hash:
É altamente recomendável que você criptografe senhas de usuário na fonte de dados da associação usando um atributo passwordFormat definido como Hashed ou Criptografado, em que Hashed é o formato mais seguro. Os valores da chave de criptografia para o algoritmo de criptografia especificado são armazenados no elemento de configuração machineKey.
No entanto, tentei definir a chave de validação da chave da máquina no web.config e ainda gerava o mesmo hash de senha que antes era definido, de modo que parece não ter efeito.
Eu também estive olhando para oCódigo fonte SqlMembershipProvider e até onde eu sei, ele usa um hash com chave. Concedido que é a fonte do .Net 4.6.1 e estou executando o 4.5. Eu copiei oEncodePassword
código-fonte e modificado para que ele possa ser executado em um aplicativo de console e no meu aplicativo de console ainda recebo um hash diferente do resultado do MembershipProvider (na mesma máquina) para a mesma senha e valor salt.
Se estivesse usando uma chave aleatória, você não conseguiria validar senhas. Então, de onde o SqlMembershipProvider obtém sua chave de hash?