Gerenciando senhas

As credenciais de nome de usuário e senha permanecem comuns para autenticação, mesmo que métodos mais fortes, como certificados, biometria e chaves de passagem, se tornem mais difundidos. Chaves de criptografia e outros segredos também exigem proteção. Os sistemas de software devem lidar com essas credenciais com segurança para resistir ao roubo de credenciais, ataques de reprodução e movimentação lateral por invasores.

Aviso

Nunca codifique senhas, chaves de API, cadeias de conexão ou outros segredos no código-fonte. Segredos codificados são extraídos trivialmente por invasores usando descompiladores, inspeção de memória ou vazamentos de código-fonte. Essa é uma das vulnerabilidades relacionadas a credenciais mais comuns exploradas em ataques reais.

Importante

Quando terminar de usar senhas ou segredos na memória, substitua imediatamente o buffer chamando SecureZeroMemory. Ao contrário de memset, o compilador não pode eliminar SecureZeroMemory por otimização, garantindo que os segredos sejam realmente apagados.

Gerenciamento de credenciais moderno

Para um novo desenvolvimento em Windows, use estas abordagens na ordem de preferência:

  1. Elimine senhas sempre que possível. Use Windows Hello, chaves de passagem (FIDO2/WebAuthn) ou autenticação baseada em certificado para evitar o tratamento total de senhas.
  2. Use o Gerenciador de Credenciais Windows. Chame CredWrite e CredRead para armazenar e recuperar credenciais no cofre de credenciais do sistema operacional, que as criptografa com a chave de sessão de logon do usuário.
  3. Use o DPAPI para armazenamento de segredo local. Chame CryptProtectData para criptografar segredos que devem ser mantidos localmente. O DPAPI vincula a criptografia à conta de usuário ou ao computador, fornecendo defesa detalhada.
  4. Para credenciais de serviço, use identidades gerenciadas ou cofres de chaves. Os serviços em execução em Azure devem usar identidades gerenciadas. Os serviços locais devem recuperar segredos de um cofre seguro em runtime, em vez de armazená-los em arquivos de configuração.

Princípios de tratamento de senha

Quando as senhas devem ser tratadas no código:

  • Colete senhas o mais tarde possível e descarte-as o mais cedo possível. Minimize a janela durante a qual o segredo existe na memória.
  • Nunca registre senhas ou segredos. Certifique-se de que os registros de diagnóstico, os registros de eventos e os despejos de memória não contenham informações de credenciais.
  • Nunca transmita senhas em texto sem formatação. Sempre use TLS/HTTPS ou um canal criptografado equivalente.
  • Solicite informações de forma segura. Use CredUIPromptForWindowsCredentials para coletar credenciais por meio da caixa de diálogo de credencial Windows padrão, que impõe o isolamento seguro da área de trabalho.

Para obter mais informações sobre ameaças e mitigações: