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?

questionAnswers(1)

yourAnswerToTheQuestion